Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2013, 14:41   #1
rafffkaaa
Пользователь
 
Регистрация: 04.01.2012
Сообщений: 26
По умолчанию Удаление узла из дерева

Создаю дерево(картинку прикрепил):
Код:
program BinTree;
 
uses Tree;
 
var
  TheRoot, P: PNode;
  N: Integer; // Узел который будем искать etc
 
begin
  TheRoot := Init;
  MakeRoot(TheRoot, 7);
 
  { Левое поддерево }
  AppendLeft(TheRoot, 4);
  AppendLeft(TheRoot^.Left, 2);
  AppendRight(TheRoot^.Left, 3);
  AppendRight(TheRoot^.Left^.Right, 1);
  AppendLeft(TheRoot^.Left^.Right^.Right, 0);
 
  { Правое поддерево }
  AppendRight(TheRoot, 9);
  AppendLeft(TheRoot^.Right, 10);
  AppendLeft(TheRoot^.Right^.Left, 11);
  AppendRight(TheRoot^.Right, 12);
 
  { Обходы дерева }
  Writeln('Прямой обход дерева');
  PreOrder(TheRoot);
  Writeln();
  Writeln('Обратный обход дерева');
  PostOrder(TheRoot);
  Writeln();
  Writeln('Концевой обход дерева');
  ReverseOrder(TheRoot);
  Writeln();
 
  { Удаление/Поиск значений }
  Writeln('Введите искомый узел');
  Readln(N);
  P := Find(TheRoot, N);
  if P = Nil then
    Writeln('Узел не найден')
  else
    Writeln('Узел найден');
 
  Writeln('Введите узел который нужно удалить');
  Readln(N);
  Remove(TheRoot, N);
 
  { Обходы дерева }
  Writeln('Прямой обход дерева');
  PreOrder(TheRoot);
  Writeln();
  Writeln('Обратный обход дерева');
  PostOrder(TheRoot);
  Writeln();
  Writeln('Концевой обход дерева');
  ReverseOrder(TheRoot);
  Writeln();
 
  { Удаляем дерево }
  DestroyTree(TheRoot);
  readln;
end.
Сама процедура:
Код:
procedure DeleteNode(var Root: PNode; E: TInfo);
 
function DownNode(X: PNode): PNode;
begin
  if X^.Left = Nil then
  begin
    Result := X;
    Exit;
  end;
  Result := DownNode(X^.Left);
end;
 
procedure FinalDelete(var Root: Pnode; XNode: PNode);
var
  Min: PNode;
begin
  if (XNode^.Left = Nil) and (XNode^.Right = Nil) then
  begin
    if Root^.Left = XNode then
      Root^.Left := Nil
    else
      Root^.Right := Nil;
    Dispose(XNode);
  end
  else
    if (XNode^.Left <> Nil) and (XNode^.Right <> Nil) then
    begin
      Min := DownNode(XNode^.Right);
      if Root^.Left = XNode then
        Root^.Left := Min
      else
        Root^.Right := Min;
      Min^.Left := XNode^.Left;
      Dispose(XNode);
    end
    else
    begin
      if XNode^.Left <> Nil then
      begin
        if Root^.Left = XNode then
          Root^.Left := XNode^.Left^.Left
        else
          Root^.Right := XNode^.Left^.Left;
      end;
      Dispose(XNode);
    end;
end;
 
begin
  if Root = Nil then
    Exit;
 
  if Root^.Left <> Nil then
  if Root^.Left^.Info <> E then
    DeleteNode(Root^.Left, E)
  else
    FinalDelete(Root, Root^.Left);
 
  if Root^.Right <> Nil then
  if Root^.Right^.Info <> E then
    DeleteNode(Root^.Right, E)
  else
    FinalDelete(Root, Root^.Right);
 
end;
Узел 4 к примеру удаляется без проблем, а если удалятьузел 3, то при повторном обходе вылетает ошибка в процедуре обхода.
Изображения
Тип файла: png Дерево.PNG (77.3 Кб, 124 просмотров)
rafffkaaa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Haskell поиск пути от корня бинарного дерева до узла [x,y] Fill_x Помощь студентам 0 10.11.2011 18:34
Как отследить удаление узла в TreeView Greek9000 Общие вопросы .NET 6 24.05.2011 07:58
Удаление узла из красно-черного дерева CodeNOT Общие вопросы C/C++ 0 18.05.2011 07:15
удаление узлов из дерева ArniLand Общие вопросы по Java, Java SE, Kotlin 0 22.09.2010 21:36