es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lisp imprime un árbol nivel por nivel

Tengo en LISP un árbol representado como lista de la siguiente manera:
(A 2 B 0 C 2 D 0 E 0)

Esto significa que A tiene 2 hijos (B y C), B tiene 0, y así sucesivamente…

Mi tarea es escribir cada nivel del árbol.

Sé sobre esta publicación: https://stackoverflow.com/questions/384419/lisp-displaying-binary-tree-level-by-level, pero ¿cómo puedo usar mi representación de lista en lugar de eso en esa publicación?

Imagen de referencia: aquí

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para escribir cada nivel del árbol representado como una lista en LISP, puedes usar el siguiente código:

    (defun list-to-tree (l)
      (labels ((build (lst)
                 (if (null lst)
                     (values nil nil)
                   (let ((left (build (cdr lst)))
                         (right (build (cddr lst))))
                     (values (cons (car lst) left) right)))))
        (car (build l))))
    
    (defun level-order (tree)
      (let ((queue (list tree))
            (result nil))
        (loop while queue do
              (let ((node (pop queue)))
                (when node
                  (push (car node) result)
                  (push (cadr node) queue)
                  (push (caddr node) queue))))
        (reverse result)))
    
    (defun display-levels (l)
      (let ((tree (list-to-tree l)))
        (dotimes (i (1+ (count-nodes tree)))
          (format t "Nivel ~d: ~{~A~^ ~}~%" i (level-order tree))
          (setf tree (remove-nil-leaves tree t))))
          tree)
    

    La función list-to-tree convierte la representación en lista del árbol en una estructura de lista anidada. La función level-order genera una lista de nodos del árbol en orden de nivel. Finalmente, la función display-levels imprime cada nivel del árbol junto con sus nodos correspondientes.

Comments are closed.