Пустые и непустые бинарные деревья - 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)))). Результатом является вывод дерева на экран.