Определить функцию, которая добавляет в упорядоченное дерево элемент а - Lisp
Формулировка задачи:
Определить функцию (ДОБАВЬ а дерево), которая добавляет в упорядоченное дерево (дерево) элемент а. (Подсказка: копировать дерево по пути поиска и подправлять нужное поддерево).
Если изначально дерево не пустое: (setq tree '(90 0 100)), то нужно добавить в это дерево новый элемент.
Решение задачи: «Определить функцию, которая добавляет в упорядоченное дерево элемент а»
textual
Листинг программы
;; Добавить a в упорядоченное дерево tree (defun add-in-tree (a tree) (cond ((null tree) (list nil a nil)) ((> a (cadr tree)) (list (car tree) (cadr tree) (add-in-tree a (caddr tree)))) (t (list (add-in-tree a (car tree)) (cadr tree) (caddr tree))))) ==> add-in-tree ;; Создание пустого дерева (setq *tree* nil) ==> NIL ;; добавим 5 (setq *tree* (add-in-tree 5 *tree*)) ==> (NIL 5 NIL) ;; добавим 6 (setq *tree* (add-in-tree 6 *tree*)) ==> (NIL 5 (NIL 6 NIL)) ;; добавим 0 (setq *tree* (add-in-tree 0 *tree*)) ==> ((NIL 0 NIL) 5 (NIL 6 NIL)) ;; добавим 1 (setq *tree* (add-in-tree 1 *tree*)) ==> ((NIL 0 (NIL 1 NIL)) 5 (NIL 6 NIL)) ;; добавим 8 (setq *tree* (add-in-tree 8 *tree*)) ==> ((NIL 0 (NIL 1 NIL)) 5 (NIL 6 (NIL 8 NIL))) ;; Преобразовать дерево в список (порядок обхода: левое - корень - правое) (defun tree-to-list (tree) (cond ((null tree) nil) (t (append (tree-to-list (car tree)) (list (cadr tree)) (tree-to-list (caddr tree)))))) ==> tree-to-list ;; Проверка (tree-to-list *tree*) ==> (0 1 5 6 8)
Объяснение кода листинга программы
В данном коде определена функция add-in-tree
, которая добавляет элемент a
в упорядоченное дерево tree
.
Алгоритм работы функции следующий:
- Если дерево пустое, то возвращается новое дерево, состоящее из одного элемента —
a
. - Если
a
больше элемента, находящегося в корне дерева, то рекурсивно вызывается функция для правой части дерева. - Если
a
меньше или равно корню дерева, то рекурсивно вызывается функция для левой части дерева, а в качестве третьего аргумента передается результат вызова функции для правой части дерева. Также в коде определена функцияtree-to-list
, которая преобразует дерево в список. Алгоритм работы функции следующий: - Если дерево пустое, то возвращается
nil
. - Если узел дерева не является листовым, то в список добавляются значения, полученные при вызове функции для левого поддерева, корня и правого поддерева.
В конце кода вызывается функция
tree-to-list
для преобразования дерева в список и выводится результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д