Пустые и непустые бинарные деревья - Lisp
Формулировка задачи:
Доброго времени суток, прошу помочь. Необходимо написать программу для работы со списком.
"Имеется список, элементы которого — бинарные деревья, пустые и непустые. Удалить из списка все пустые бинарные деревья, затем вывести на экран все элементы полученного списка в виде деревьев."
Решение задачи: «Пустые и непустые бинарные деревья»
textual
Листинг программы
(defun clear (w) (let* ((rw (strRev w)) (p (strInd rw "|"))) (if (= p 1) (strRev (strCat " " (strMid rw 2))) (strRev (strCat (strLeft rw (- p 1)) " " (strMid w (+ p 1))))))) (defun draw-tree (tree &optional (w "|")) (cond ((null tree) nil) ((atom (car tree)) (printsline (strCat w "--" (output (car tree)))) (draw-tree (cdr tree) w)) (t (printsline (strCat w "--<*>")) (draw-tree (car tree) (strCat (if (null (cdr tree)) (clear w) w) " |")) (draw-tree (cdr tree) w)))) (defun task (tree-list) (mapcar (lambda (tree) (when tree (draw-tree tree) (terpri)(terpri))) tree-list)) ;; Проверка: (task '((5 (1 (4 NIL NIL) (2 (4 NIL NIL))) (9 (1 NIL NIL) (8 (2 NIL NIL)))) (a (b nil nil) (c nil nil)) nil (0 (111 nil nil) (222 nil nil)))) |--5 |--<*> | |--1 | |--<*> | | |--4 | | |--NIL | | |--NIL | |--<*> | |--2 | |--<*> | |--4 | |--NIL | |--NIL |--<*> |--9 |--<*> | |--1 | |--NIL | |--NIL |--<*> |--8 |--<*> |--2 |--NIL |--NIL |--A |--<*> | |--B | |--NIL | |--NIL |--<*> |--C |--NIL |--NIL |--0 |--<*> | |--111 | |--NIL | |--NIL |--<*> |--222 |--NIL |--NIL
Объяснение кода листинга программы
- Сначала давайте разберемся с функцией
clear
. Она принимает один аргументw
. Внутри функции мы преобразуем его в обратную строку и находим индекс первого символа|
с помощьюstrInd
. Еслиp
(который является результатомstrInd
) равен 1, мы удаляем пробел в начале строкиw
и добавляем обратную строку` (пробел) между первым и вторым символами
|. В противном случае мы удаляем пробел в начале строки
wи добавляем обратную строку
(пробел) между предпоследним и последним символами
|`. - Функция
draw-tree
принимает два аргумента:tree
иw
. Еслиtree
являетсяnil
, функция возвращаетnil
. Еслиtree
является атомом, функция печатает--
и символ дерева (первый элементtree
) и затем вызывает себя для остальной части дерева. Еслиtree
не являетсяnil
или атомом, функция печатает--<*>
и затем вызывает себя для левого поддерева и правого поддерева. - Функция
task
принимает один аргументtree-list
и применяетmapcar
к каждому элементу списка. Внутриmapcar
используется лямбда-функция, которая вызываетdraw-tree
для каждого дерева в списке. Если дерево являетсяnil
, ничего не происходит. - Наконец, мы проверяем функцию
task
с помощью списка деревьев:(5 (1 (4 NIL NIL) (2 (4 NIL NIL))) (9 (1 NIL NIL) (8 (2 NIL NIL))))
. Результатом является вывод дерева на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д