Пустые и непустые бинарные деревья - 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))))
. Результатом является вывод дерева на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д