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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2014, 10:10   #1
Simon1712
Пользователь
 
Регистрация: 11.11.2012
Сообщений: 36
По умолчанию Идеально сбалансированное дерево

ИСД - бинарное дерево, в котором количество элементов в левом и правом поддереве отличается не более чем на 1.
Написал процедуру построения, удаления элемента, а также вывода дерева...
Появилась проблема, элемент надо удалять так чтобы дерево осталось идеально сбалансированным, есть случай, когда после удаления балнс нарушается. Интересует, как можно переписать процедуру удаления или написать процедуру балансировки такого дерева. Благодарю за помощь!
Simon1712 вне форума Ответить с цитированием
Старый 20.02.2014, 10:11   #2
Simon1712
Пользователь
 
Регистрация: 11.11.2012
Сообщений: 36
По умолчанию

Код:
type
  ptr = ^tree;
  tree = record
    left, right : ptr;
    val : integer;
  end;

var
  n, k : integer;
  p : ptr;

function CrTree(n : integer) : ptr;
var
  newtree : ptr;
  x, n1, n2 : integer;
begin
  if n = 0 then
    CrTree := nil
  else
  begin
    n1 := n div 2;
    n2 := n - n1 - 1;
    read(x);
    new(newtree);
    with newtree^ do
    begin
      val := x;
      left := CrTree(n1);
      right := CrTree(n2);
    end;
    CrTree := newtree;
  end;
end;

procedure print(t : ptr; h : integer);
var
  i : integer;
Begin
  if t <> nil then
    with t^ do
    begin
      print(right, h + 1);
      for i := 1 to h do
        write('   ');
      writeln(val);
      print(left, h + 1);
    end;
end;

procedure del(k : integer; var t : ptr);
var
  q : ptr;

procedure lr(var m : ptr);
begin
  if m^.right <> nil then
    lr(m^.right)
  else
  begin
    q^.val := m^.val;
    q := m;
    m := m^.left;
    dispose(q);
  end;
end;

begin
  if t <> nil then
  begin
    if k <> t^.val then
    begin
      del(k, t^.left);
      del(k, t^.right);
    end
    else
    begin
      q := t;
      if q^.right = nil then
      begin
        t := q^.left;
        dispose(q);
      end
      else
      begin
        if q^.left = nil then
        begin
          t := q^.right;
          dispose(q);
        end
        else
          lr(q^.left);
      end;
    end;
  end;
end;

begin
  readln(n);
  p := CrTree(n);
  print(p, 0);
  readln(k);
  del(k, p);
  print(p, 0);
end.
Вот то что есть
Simon1712 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Идеально-сбалансированное дерево trum Помощь студентам 1 28.05.2012 21:37
Сбалансированное дерево C# alenachitnaeva Помощь студентам 0 23.05.2012 21:37
идеально сбалансированное дерево sibguty Помощь студентам 0 12.12.2011 20:29
сбалансированное дерево prostac Помощь студентам 0 21.09.2010 16:29
Идеально сбалансированное дерево Осипович Общие вопросы Delphi 0 16.05.2009 15:54