Пустые и непустые бинарные деревья - 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

Объяснение кода листинга программы

  1. Сначала давайте разберемся с функцией clear. Она принимает один аргумент w. Внутри функции мы преобразуем его в обратную строку и находим индекс первого символа | с помощью strInd. Если p (который является результатом strInd) равен 1, мы удаляем пробел в начале строки w и добавляем обратную строку ` (пробел) между первым и вторым символами|. В противном случае мы удаляем пробел в начале строкиwи добавляем обратную строку (пробел) между предпоследним и последним символами|`.
  2. Функция draw-tree принимает два аргумента: tree и w. Если tree является nil, функция возвращает nil. Если tree является атомом, функция печатает -- и символ дерева (первый элемент tree) и затем вызывает себя для остальной части дерева. Если tree не является nil или атомом, функция печатает --<*> и затем вызывает себя для левого поддерева и правого поддерева.
  3. Функция task принимает один аргумент tree-list и применяет mapcar к каждому элементу списка. Внутри mapcar используется лямбда-функция, которая вызывает draw-tree для каждого дерева в списке. Если дерево является nil, ничего не происходит.
  4. Наконец, мы проверяем функцию task с помощью списка деревьев: (5 (1 (4 NIL NIL) (2 (4 NIL NIL))) (9 (1 NIL NIL) (8 (2 NIL NIL)))). Результатом является вывод дерева на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5