Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Реализация бинарных деревьев.   Найти похожие ветки 

 
Glex ©   (2006-01-27 18:55) [0]

Мне нужно за 5 часов научиться полностью работать с бинарными деревьями.
Я нигде не нашёл толкового справочника именно по реализации деревьев в Delphi.
Я попробовал описать тип дерева сам.
Вот:
type pt = ^joint;

joint = record
 Val: integer;
 Left, Right: pt;
 end;
...
var tree: pt;

Я не имею понятия о правильности придуманного мной описания дерева.

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

ПОМОГИТЕ!!!!!!


 
Glex ©   (2006-01-27 18:58) [1]

Я уже всем наверное надоел))))
Но обещаю сделать что-нибудь хорошее для обучения таких же как я потом)


 
Кефир87 ©   (2006-01-27 19:36) [2]

Ркурсия!


procedure DoTmthWithNode(node:pt);
begin
 pt.blablabla := 45454;
 new(pt.Left);
 new(pt.Right);
 DoThthWithNode(pt.Left);
 DoThthWithNode(pt.Right);
end;


 
Кефир87 ©   (2006-01-27 19:37) [3]

Пальцы кривые 8) Хотя все равно в этом коде нет смысла и в итоге он вызовет переполнение стэка 8)

procedure DoTmthWithNode(node:pt);
begin
pt.blablabla := 45454;
new(pt.Left);
new(pt.Right);
DoTmthWithNode(pt.Left);
DoTmthWithNode(pt.Right);
end;


 
Glex ©   (2006-01-27 19:52) [4]

procedure DoSmthWithNode(node:pt);
begin
pt.val := 45454;
new(pt.Left);
new(pt.Right);
DoTmthWithNode(pt.Left);
DoTmthWithNode(pt.Right);
end;


[Error] Object or class type required
:((((((


Я идею понял, но не понимаю синтаксис до конца(
Например, new();


 
Glex ©   (2006-01-27 19:54) [5]

type pt = ^node;

node = record
 Val: integer;
 Left, Right: pt;
 end;


Это правильно, или можно так не извращаться с указателями? =)


 
Glex ©   (2006-01-27 20:17) [6]

Умоляю, помогите, и, если реально, предложите способ без рекурсии, но с циклом


 
Glex ©   (2006-01-27 20:21) [7]

Исправил ошибки в алгоритме Кефира.

procedure DoSmthWithNode(var node: pt);
begin
node.val := 45454;
new(node.Left);
new(node.Right);
DoSmthWithNode(node.Left);
DoSmthWithNode(node.Right);
end;

вылетает в конец программы на первой строчке 8-|


 
Glex ©   (2006-01-27 20:29) [8]

Yahoo!!! Кефир, с меня кефир!!!!

Нужно было инициализировать само tree командой new(tree)


 
Cash ©   (2006-01-27 20:30) [9]

Ужас! как так без деревьев то жить можно? (особенно без бинарных :D)
Ониж кислород дают.
:) :) :) :)

А если в серьез, то вам сюда, товарищ!:
http://algolist.manual.ru

Если и после этого вопросы будут, отпишись, постараюсь пояснить.


 
Glex ©   (2006-01-27 20:43) [10]

Cash

Там есть принципы и теория. Это я знаю Но там нет того, что мне надо!
Вопрос реализации на паскале.

Мне серьёзно некогда. 3 часа осталось. Мне техническую сторону, а там сам додумаю!
Ну помогите же кто-нибудь.

В алгоритме кефира правые деревья не будут обойдены даже так
procedure DoSmthWithNode(var node: pt; prevnode: pt);
begin
node.val := 45454;
node.Level:= prevNode.Level+1;
new(node.Left);
new(node.Right);
if Node.Level<=N then
DoSmthWithNode(node.Left, node);
if Node.Level<=N then
DoSmthWithNode(node.Right, node);
end;


 
Kolan ©   (2006-01-27 21:23) [11]

Вот глянь
http://www.fvt.rsu.ru/index.php?page=student&selection=main&navigation=help_main&topic=help

Там две статьи к сожалению про деревья недописана.

НО Проекты там рабочие. И автор я вопросы - пожалуйста.


 
Кефир87 ©   (2006-01-27 21:52) [12]


> procedure DoSmthWithNode(node:pt);
> begin
> pt.val := 45454;
> new(pt.Left);
> new(pt.Right);
> DoTmthWithNode(pt.Left);
> DoTmthWithNode(pt.Right);
> end;
>
> [Error] Object or class type required
> :((((((
>


Опять пальцы кривые:

procedure DoSmthWithNode(node:pt);
begin
pt.val := 45454;
new(node.Left);
new(node.Right);
DoTmthWithNode(node.Left);
DoTmthWithNode(node.Right);
end;


 
Kolan ©   (2006-01-27 21:55) [13]

В любом случае советую использовать объекты...
ЗЫ
 Там тебе только одна статья нужна, про деревья...


 
Кефир87 ©   (2006-01-27 21:57) [14]

ТФУ

procedure DoSmthWithNode(node:pt);
begin
node.val := 45454;
new(node.Left);
new(node.Right);
DoTmthWithNode(node.Left);
DoTmthWithNode(node.Right);
end;


 
Кефир87 ©   (2006-01-27 22:03) [15]

И еще раз хочу сказать! В этой процедуре нужно сделать какое-то услове, при котором она не будет вызывать сама себя. Иначе переполнение стэка! Например:

procedure DoSmthWithNode(node:pt);
begin
node.val := 45454;
inc(counter);
if conter<100 then
begin
new(node.Left);
new(node.Right);
DoTmthWithNode(node.Left);
DoTmthWithNode(node.Right);
end;
end;


В этом коде надо понять только идею!


 
Cash ©   (2006-01-28 14:31) [16]

Glex ©   (27.01.06 20:43) [10]:
А какое из бинарных тебе надо? АВЛ? СДП? или простое?
Кефир нормально расписал, но для понимания надож время,
а его, как я понял, у тебя нету. Так что сабж надо уточнить,
и тогда дам нужный код. Надо только знать какой тип дерева и
какая манипуляция с этим деревом.

Для наглядности, процедура заполнения из масива для СДП выглядит так:

Type
  PTN = ^TTN;
  TTN = record
    Data: Word;
    Left: PTN;
    Right: PTN;
  end;

var
  Root: PTN;
  Data: array [0..100] of word;
  i: integer;

  Function AddNode(DI: integer): PTN;
  begin
    New(Result);
    Result^.Data:=DI;
    Result^.Left:=nil;
    Result^.Right:=nil;
  end;

  Procedure BuildTree(var R: PTN; DI: integer); // Это то, что надо
  begin
    if R^.Data < DI then begin
      if R^.Right <> nil then BuildTree(R^.Right,DI)
      else R^.Right:=AddNode(DI);
    end else begin
      if R^.Left <> nil then BuildTree(R^.Left,DI)
      else R^.Left:=AddNode(DI);
    end;
  end;

begin
  randomize;
  for i:=0 to 100 do Data[i]:=random(1000)+1;
  Root:=AddNode(Data[0]);
  i:=1;
  while i < 101 do begin
  BuildTree(Root,Data[i]);
  inc(i);
  end;
end;


 
Кефир87 ©   (2006-01-28 15:14) [17]


> Glex ©   (27.01.06 18:55)
>
> Мне нужно за 5 часов научиться полностью работать с бинарными
> деревьями.

Боюсь... мы не успели...


 
Cash ©   (2006-01-28 15:32) [18]

UUps.... :)


 
Glex ©   (2006-01-30 19:37) [19]

Ничего, теперь у меня ещё год)


 
Cash ©   (2006-01-30 19:47) [20]

[19]:
Не взяли чтоли?
А тебе куда надо было то?



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.043 c
15-1138625475
syte_ser78
2006-01-30 15:51
2006.02.19
какого рекламодателя использывать?


15-1138374388
oldman
2006-01-27 18:06
2006.02.19
Толи воздух нынче пьян, то ли леший нынче рьян...


3-1135261243
Barsky
2005-12-22 17:20
2006.02.19
Значения AutoInc поля только что введенной записи


3-1135322035
SeZuka
2005-12-23 10:13
2006.02.19
Отлючение триггера


15-1138429327
Карелин Артем
2006-01-28 09:22
2006.02.19
Сила алкоголя...