Определить функцию, которая ищет заданную вершину в дереве - Lisp
Формулировка задачи:
Помогите, пожалуйста, с заданием!
Определить функцию, которая ищет заданную вершину в дереве и возвращает список, содержащий предка искомой вершины и её потомков: (предок (потомок1 потомок2...))
Решение задачи: «Определить функцию, которая ищет заданную вершину в дереве»
textual
Листинг программы
(defun task (root what &optional (from nil)) (cond ((null root) nil) ((= (cadr root) what) (cons (cadr from) (list (remove what(tree2list root))))) (t (append (task (car root) what root) (task (caddr root) what root))))) ==> TASK (task '(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) -4) ==> (11 (7)) (task '(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) 23) ==> (11 (111 8))
Объяснение кода листинга программы
В коде определена функция task, которая принимает три аргумента: root (корневой элемент дерева), what (элемент, который нужно найти в дереве) и необязательный аргумент from (используется для возврата коллекции узлов, содержащих искомый элемент).
Функция использует конструкцию cond для проверки трех условий:
- Если
rootравенnil, то возвращаетсяnil. - Если
cadr rootравенwhat, то возвращается новая коллекция, содержащаяwhatи все поддеревья, которые не содержатwhat. - Если условие не выполнено, то рекурсивно вызывается функция
taskдля двух новых поддеревьев, которые получаются путем разделенияrootна две части поwhat. В примере кода вызывается функцияtaskс аргументами:(((nil 111 nil) 23 (nil 8 nil)) 11 (nil -4 (nil 7 nil))) -4иnil. Первая строка(11 (7))в выводе означает, что функция нашла элемент-4в дереве, и возвращает новый список, содержащий только узлы, которые содержат-4. Вторая строка(11 (111 8))означает, что функция нашла элемент23в дереве, и возвращает новый список, содержащий только узлы, которые содержат23.