Деревья: количество листьев на заданном подуровне + удаление узлов - 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.

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

  1. Структура данных для представления дерева - тип PTree, который содержит ссылку на левое и правое поддерево, а также хранит информацию о текущем узле.
  2. Создание нового узла - процедура Create, которая выделяет память под новый узел и инициализирует его поля.
  3. Добавление нового элемента в дерево - процедура Add, которая рекурсивно вызывается для каждого узла, пока не будет достигнут листовой узел, и вставляет новый элемент в дерево.
  4. Печать дерева - процедура Print, которая рекурсивно вызывается для каждого узла и выводит информацию о текущем узле и его потомках.
  5. Определение уровня элемента в дереве - функция ItemLevel, которая рекурсивно вызывается для каждого узла и подсчитывает количество элементов на заданном уровне.
  6. Удаление дерева - процедура DeleteTree, которая рекурсивно вызывается для каждого узла и освобождает память, выделенную под узлом.
  7. Поиск узла для удаления - процедура FindToRemove, которая рекурсивно вызывается для каждого узла и ищет узел с заданным значением.
  8. Основной код программы - создает и заполняет случайными значениями дерево, печатает его, запрашивает уровень и количество элементов на удаление, вызывает функцию FindToRemove для удаления указанного количества элементов на заданном уровне.
  9. В конце основной код программы вызывает функцию DeleteTree для удаления всего дерева.

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


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

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

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