Определить функцию, которая добавляет в упорядоченное дерево элемент а - 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. Алгоритм работы функции следующий:

  1. Если дерево пустое, то возвращается новое дерево, состоящее из одного элемента — a.
  2. Если a больше элемента, находящегося в корне дерева, то рекурсивно вызывается функция для правой части дерева.
  3. Если a меньше или равно корню дерева, то рекурсивно вызывается функция для левой части дерева, а в качестве третьего аргумента передается результат вызова функции для правой части дерева. Также в коде определена функция tree-to-list, которая преобразует дерево в список. Алгоритм работы функции следующий:
  4. Если дерево пустое, то возвращается nil.
  5. Если узел дерева не является листовым, то в список добавляются значения, полученные при вызове функции для левого поддерева, корня и правого поддерева. В конце кода вызывается функция tree-to-list для преобразования дерева в список и выводится результат.

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


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

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

7   голосов , оценка 3.857 из 5
Похожие ответы