Деревья: количество листьев на заданном подуровне + удаление узлов - PascalABC.NET
Формулировка задачи:
1.подсчитать кол-во листьев на заданном подуровне
2. удаление вершины с ее поддеревом через освобождение памяти
паскаль
заранее спасибо
Решение задачи: «Деревья: количество листьев на заданном подуровне + удаление узлов»
textual
Листинг программы
type PTree = ^TTree; TTree = record Data : integer; L, R : PTree; end; procedure Add(var Root : PTree; v : integer); procedure Create(var p : PTree; info : integer); begin new(p); p^.Data := info; p^.L := nil; p^.R := nil; end; begin if Root = nil then Create(Root, v) else if Root^.Data < v then Add(Root^.R, v) else if Root^.Data > v then Add(Root^.L, v); end; procedure Print(Root : PTree; level : integer := 0); begin if Root <> nil then begin Print(Root^.L, level + 1); writeln('':2*level, Root^.Data); Print(Root^.R, level + 1); end end; function ItemLevel(Root : PTree; lvl : integer; currLevel : integer := 0) : integer; begin if Root <> nil then begin if lvl = currLevel then Result := 1 else Result := ItemLevel(Root^.L, lvl, currLevel + 1) + ItemLevel(Root^.R, lvl, currLevel + 1); end else Result := 0; end; procedure DeleteTree(var Root: PTree); Begin if Root <> nil then begin DeleteTree(Root^.R); DeleteTree(Root^.L); Dispose(Root); Root := nil; end; end; procedure FindToRemove(var Root : PTree; v : integer); begin if Root^.Data = v then DeleteTree(Root) else if (Root^.L <> nil) and (Root^.L^.Data = v) then DeleteTree(Root^.L) else if (Root^.R <> nil) and (Root^.R^.Data = v) then DeleteTree(Root^.R) else if v < Root^.Data then FindToRemove(Root^.L, v) else FindToRemove(Root^.R, v); end; var R : PTree = nil; lvl, st : integer; begin for var i := 1 to 20 do Add(R, Random(100)); Print(R); write('level = '); readln(lvl); writeln('items on level ', lvl, ' : ', ItemLevel(R, lvl)); write('subtree to remove: '); readln(st); FindToRemove(R, st); Print(R); DeleteTree(R); end.
Объяснение кода листинга программы
- Структура данных для представления дерева - тип PTree, который содержит ссылку на левое и правое поддерево, а также хранит информацию о текущем узле.
- Создание нового узла - процедура Create, которая выделяет память под новый узел и инициализирует его поля.
- Добавление нового элемента в дерево - процедура Add, которая рекурсивно вызывается для каждого узла, пока не будет достигнут листовой узел, и вставляет новый элемент в дерево.
- Печать дерева - процедура Print, которая рекурсивно вызывается для каждого узла и выводит информацию о текущем узле и его потомках.
- Определение уровня элемента в дереве - функция ItemLevel, которая рекурсивно вызывается для каждого узла и подсчитывает количество элементов на заданном уровне.
- Удаление дерева - процедура DeleteTree, которая рекурсивно вызывается для каждого узла и освобождает память, выделенную под узлом.
- Поиск узла для удаления - процедура FindToRemove, которая рекурсивно вызывается для каждого узла и ищет узел с заданным значением.
- Основной код программы - создает и заполняет случайными значениями дерево, печатает его, запрашивает уровень и количество элементов на удаление, вызывает функцию FindToRemove для удаления указанного количества элементов на заданном уровне.
- В конце основной код программы вызывает функцию DeleteTree для удаления всего дерева.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д