Я пытаюсь распечатать в порядке уровня дерево с общим Lisp.
Список равен (1 (2 4 (5 (8 11)) 6) (3 (7 9 10)))
, что означает, что дерево упорядочено:
1. 1
2. 2 3
3. 4 5 6 7
4. 8 9 10
5. 11
Здесьэто быстрый макет дерева:
Я пытаюсь напечатать это дерево в этом порядке, выполнив поиск в ширину.
То, о чем я здесь думал, это то, что я просто должен был бы car
и cdr
пройти через это дерево, но у меня были огромные проблемы, чтобы понять, как именно.Вот именно то, что я пробовал в полупсевдокоде.
(defun traverse (*cur-level*)
(print (car *cur-level*)) ; print out the first element of the current level
(if (cdr *cur-level*) ; if cdr of next level is not nil
(setq *next-level* (cdr *cur-level*) ;set that to be the next level
(traverse *next-level*)) ; recursively call until all levels traversed.
; else, simply do not do anything and terminate
; the function.
Проходя по дереву самостоятельно, я обнаружил, что во втором цикле этот алгоритм ломается, потому что
;first loop
(car *cur-level) = 1
(cdr *cur-level*)=((2 4 (5 (8 11)) 6) (3 (7 9 10)),
, поэтому в следующем цикле
;second loop
(car *cur-level*) = (2 4 (5 (8 11)) 6)
(cdr *cur-level*) = (3 (7 9 10))
Это означает, что дерево по существу разделяется, и (2 4 (5 (8 11)) 6)
игнорируется.
Кроме того, в том же цикле(car cur-level)
- это не отдельный элемент, а список.Это значит, что мне нужно сделать:
;still second loop
(car (car *cur-level*) = 2
(cdr (car *cur-level*) = (4 (5 (8 11)) 6)
Поэтому я попытался включить условие, которое проверяет размер уровня:
(if (> (list-length (car *cur-level*)) 1)
(print (car (car *cur-level*))
(setq *next-level* (cdr (car *cur-level*))
Но это не исправляет тот факт, что (3 (7 9 10)
отделен от дерева, что означает, что порядок печатается неправильно, и у меня возникает ощущение, что я исправляю проблему, относящуюся только к этому дереву, вместо того, чтобы иметь правильный алгоритм.
Примечание: эта проблема возникает дважды, один раз во втором цикле и еще раз в четвертом цикле левой стороны дерева (где (car cur-level) = (5 (8 11))
).
Как я могу это сделатьправильно?Я действительно застрял здесь и понятия не имею, как продолжить.