09.11.2017, 19:03
|
Прохожий
|
|
Регистрация: 06.11.2017
Сообщения: 6
Версия Delphi: Delphi 3
Репутация: 10
|
|
Работа с деревом
Поставлена задача создать дерево. Затем отрицательные элементы заменить их абсолютными значениями. Кинул на форму TreeViev и 32 кнопки. Разбираюсь в деревьях плохо, поэтому с помощью интернета и с затратой кучей времени создал такой код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type
PNode=^TNode;
TNode=record
nKey:Integer;
nCount:integer;
pLeft:pNode;
pRight:pNode;
end;
Ttree=class
private
public
fTree:pNode;
procedure Search(x:integer;var node:PNode);
constructor Create;
end;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Vyvod(node:PNode;item:TTreeNode);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
t:TTree;
implementation
constructor TTree.Create;
begin
fTree:=nil;
end;
procedure TTree.Search(x: Integer; var node: PNode);
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(Sender: TObject);
var i,j,p:integer;
b: boolean;
item:TTreeNode;
begin
randomize;
t:=TTree.Create;
for i:=0 to 12 do
begin
j:=random(2);
if j=0 then b:=true else b:=false;
p:=random(10);
if b then t.Search(-p,t.ftree) else t.Search(p,t.ftree);
end;
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(Sender: TObject);
var item:TTreeNode;
i:integer;
begin
TreeView1.Items.Clear;
with t.fTree^ do
begin
if nKey<0 then nKey:=abs(nKey);
end;
item:=nil;
Vyvod(t.fTree,item);
end;
end.
Код меняет знак только первого элемента. Как его исправить? Спасибо.
|