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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2011, 22:34   #1
NewNub
 
Аватар для NewNub
 
Регистрация: 05.12.2011
Сообщений: 6
По умолчанию Обход деревьев

Здравствуйте. возникла проблема по обходам бинарного дерева. Посмотрите пожалуйста.
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsComCtrls;

type
 PNode
=^TNode;

  
TNode=record
    nKey
:Integer;
    
nCount:integer;
    
pLeft:pNode;
    
pRight:pNode;
  
end;
    
TTree=class
  private
  public
    
fTree:pNode;
     
M:integer;
    
procedure Search(x:integer;var node:PNode);
    
constructor Create;

  
end;
  
TForm1 = class(TForm)
    
TreeView1TTreeView;
    
Button1TButton;
    
Button2TButton;
    
Button3TButton;
    
Edit1TEdit;
    
Button4TButton;
    
Label1TLabel;
    
Label2TLabel;
    
Label3TLabel;
    
Label4TLabel;
    
Label5TLabel;
    
Button5TButton;
    
Button6TButton;
    
Label6TLabel;
    
procedure Button1Click(SenderTObject);
    
procedure Button2Click(SenderTObject);
    
procedure Vyvod(node:PNode;item:TTreeNode);
    
procedure Button3Click(SenderTObject);
    
procedure Button4Click(SenderTObject);
    
procedure Button5Click(SenderTObject);
    
procedure Button6Click(SenderTObject);

  private
    { Private 
declarations }
  public
  
N:integer;

  
Arr :array[1..20of Integer;

  
end;



var
  
Form1TForm1;
  
t:TTree;
  
node:pNode;

implementation
constructor TTree
.Create;
begin
  fTree
:=nil;
end;
procedure TTree.Search(xInteger; var nodePNode);
//  Ïîèñê âåðøèíû ñ êëþ÷îì x â äåðåâå ñî âñòàâêîé
//             (ðåêóðñèâíûé àëãîðèòì).
begin
  
if node=nil  then
  
// Âåðøèíû â äåðåâå íåò; âêëþ÷èòü åå.
  
begin
    node
:=new(PNode);
    
with node^ do begin
      nKey
:=x;
      
nCount:=1;
      
pLeft:=nil;
      
pRight:=nil;
    
end;
  
end
  
else
    if 
x<node^.nKey then
      Search
(x,node^.pLeft)
    else
      if 
x>node^.nKey then
        Search
(x,node^.pRight)
      else
        
inc(node^.nCount);
end;

{
$R *.dfm}

procedure TForm1.Button1Click(SenderTObject);
var
  
i,k:integer;
  
N:integer;
begin
button2
.Visible:=true;
label5.Visible:=true;
Label4.Caption:='';
 
randomize;
TreeView1.Items.Clear;
  
t:=TTree.Create;
  
N:=strtoint(label3.Caption);
   for 
:= 1 to N+do
   
begin
    arr
[i]:=random (100);
    
Label4.Caption:=Label4.Caption+' '+IntToStr(arr[i]);
    
end;

  for 
:= 1 to N do
    
t.Search(arr[i],t.fTree);
end;

procedure TForm1.Button2Click(SenderTObject);
var
  
item:TTreeNode;
begin
  item
:=nil;
  
Vyvod(t.fTree,item);
end;
procedure TForm1.Vyvod(node:PNode;item:TTreeNode);
var
  
tmpItem:TTreeNode;
begin
  
if node <> nil then begin
    tmpItem
:=TreeView1.Items.AddChild(item,inttostr(node^.nKey));
    
vyvod(node^.pLeft,tmpItem);
    
vyvod(node^.pRight,tmpItem);
  
end;
end;



procedure TForm1.Button3Click(SenderTObject);
begin
edit1
.Visible:=true;
button4.Visible:=true;
label1.Visible:=true;
end;

procedure TForm1.Button4Click(SenderTObject);
begin
N
:=strtoint(edit1.text);
label3.Caption:=IntToStr(N);
label2.Visible:=true;
label3.Visible:=true;
button1.Visible:=true;
end;


procedure TForm1.Button5Click(SenderTObject);
var
  
i:integer;
  
M:integer;
begin
button2
.Visible:=true;
label5.Visible:=true;
Label4.Caption:='';
 
randomize;
TreeView1.Items.Clear;
  
t:=TTree.Create;
  
M:= random(20);
  
label3.Caption:=IntToStr(M);
  
label3.Visible:=true;
label2.Visible:=true;
   for 
:= 1 to M+do
   
begin
    arr
[i]:=random (100);
    
Label4.Caption:=Label4.Caption+' '+IntToStr(arr[i]);
    
end;

  for 
:= 1 to N do
    
t.Search(arr[i],t.fTree);
end;

procedure preorder(p:PNodeg:integer); собственно вот тут то и ошибка!!!!!
begin p^.nCount:= g;
 if 
p^.pLeft<>nil then preorder(p^.pleft,g+1);
 if 
p^.pright<>nil then preorder(p^.pright,g+1);
end;

procedure TForm1.Button6Click(SenderTObject);
begin
preorder
(node,1);
end;

end
Помоги ближнему своему и тебя не забудут))
NewNub вне форума Ответить с цитированием
Старый 06.12.2011, 23:42   #2
RinatV
Пользователь
 
Регистрация: 06.07.2009
Сообщений: 27
По умолчанию

может надо делать проверку как и везде делалось на случай неправильной ссылки
Код:
procedure preorder(p:PNode; g:integer); собственно вот тут то и ошибка!!!!!
begin 
 if p=nil then exit;
 p^.nCount:= g;
 if p^.pLeft<>nil then preorder(p^.pleft,g+1);
 if p^.pright<>nil then preorder(p^.pright,g+1);
end;
RinatV вне форума Ответить с цитированием
Старый 07.12.2011, 08:15   #3
NewNub
 
Аватар для NewNub
 
Регистрация: 05.12.2011
Сообщений: 6
По умолчанию

Цитата:
Сообщение от RinatV Посмотреть сообщение
может надо делать проверку как и везде делалось на случай неправильной ссылки
Код:
procedure preorder(p:PNode; g:integer); собственно вот тут то и ошибка!!!!!
begin 
 if p=nil then exit;
 p^.nCount:= g;
 if p^.pLeft<>nil then preorder(p^.pleft,g+1);
 if p^.pright<>nil then preorder(p^.pright,g+1);
end;
а не подскажешь как это реализовать?
Помоги ближнему своему и тебя не забудут))
NewNub вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход бинарных деревьев noskovgleb C++ Builder 1 28.05.2011 20:03
Визуализатор деревьев Alekc1989 Помощь студентам 0 03.02.2011 11:02
Ошибка в сравнении деревьев kaizer131 Помощь студентам 4 26.05.2010 13:36
Сравнение деревьев kaizer131 Общие вопросы Delphi 0 22.05.2010 10:00