Привет ребята!
Есть задание:
Написать программу (Unit1), иллюстрирующую все методы работы с деревом поиска. Результат формирования и преобразования дерева показывать в компоненте TTreeView.
Определить число листьев на каждом уровне дерева.
Всё бы хорошо, но вот код неработает должным образом.
Есть ошибки, которые неполучается исправить.
Очень прошу помогите, завтра контрольную здавать.
Вот собственно код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Grids;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
TreeView1: TTreeView;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Type
Tlnf=record
s: string[80];
key: Longword;
end;
Ttree=^tree;
Tree=record
lnf: Tlnf;
A1:Ttree;
A2:Ttree;
end;
Var
Proot:Ttree;
n: integer;
implementation
{$R *.dfm}
//Создание нового листа дерева
Procedure MakeList(Var p:Ttree; lnf:Tlnf);
begin
New(p);
p^.lnf:=lnf;
p^.A1:=Nil;
p^.A2:=Nil;
end;
//Добовление листа в дерево
Procedure Dobtree(Proot:Ttree; lnf:Tlnf);
Var
P,q: Ttree;
bl: boolean;
begin
p:=Proot;
while p<>Nil do begin
q:=p; bl:=lnf.key<p^.lnf.key; //q указатель на предыдущий элемент
if bl then p:=p^.A1
else p:=p^.A2;
end;
MakeList(p,lnf);
if bl then q^.A1:=p else q^.A2:=p;
end;
Procedure ViewTree(p:Ttree; var kl: integer);
begin
if p<>Nil then begin
if kl=-1 then
Form1.TreeView1.Items.AddFirst(Nil, p^.lnf.s+''+IntToStr(p^.lnf.key))
else
Form1.TreeView1.Items.AddChildFirst(Form1.TreeView1.Items[kl], p^.lnf.s+''+IntToStr(p^.lnf.key));
lnc(kl); //Вот здесь выдает ошибку
ViewTree(p^.A1,kl);
ViewTree(p^.A2.kl); //Вот здесь выдает ошибку
Dec(kl);
end;
end;
//Прямой обход
Procedure WrtTree(Var p:Ttree);
begin
if p<>Nil then begin
Form1.Memo1.Lines.Add(p^.lnf.s);
WrtTree(p^.A1);
WrtTree(p^.A2);
end;
end;
//Сколько веток на дереве
procedure PrintTree(p: Ttree; n: byte; var s: integer);
begin
if p<>nil then
begin
if (p^.left = nil) and (root^.right = nil) then //Вот здесь выдает ошибку
s:=s+1;
PrintTree(p^.left,n+1,s);
writeln(p^.info:2*n);
PrintTree(p^.right,n+1,s);
end;
end;
//Удаление дерева из памяти
Procedure DeleteTree(var p:Ttree);
begin
if p=nil then Exit;
DeleteTree(p^.A1);
DeleteTree(p^.A2);
Dispose(p);
p:=nil;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
n:=9; Edit1.Text:=IntToStr(n);
Memo1.Clear;
With StringGrid1 do begin
Cells[0,0]:='F.I.O'; Cells[1,0]:='Number';
Cells[0,1]:='Eugene'; Cells[1,1]:='100005';
Cells[0,2]:='Stiv'; Cells[1,2]:='100002';
Cells[0,3]:='Paris'; Cells[1,3]:='100004';
Cells[0,4]:='Dan'; Cells[1,4]:='100001';
Cells[0,5]:='Bill'; Cells[1,5]:='100007';
Cells[0,6]:='Mat'; Cells[1,6]:='100006';
Cells[0,7]:='Bob'; Cells[1,7]:='100008';
Cells[0,8]:='Jack'; Cells[1,8]:='100000';
Cells[0,9]:='Tod'; Cells[1,9]:='100009';
end;
end;
//Воод данных в дерево
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
A: array[1..10] of Tlnf;
begin
for i:=1 to n do
with A[i] do begin
s:=StringGrid1.Cells[0,i];
key:=StrToInt(StringGrid1.Cells[1,i]);
end;
MakeList(Proot, a[1]);
for i:=2 to n do DobTree(Proot, a[i]);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
StringGrid1.RowCount:=N+1;
end;
//Удалить дерево
procedure TForm1.Button5Click(Sender: TObject);
begin
DeleteTree(proot);
Memo1.Clear;
TreeView1.Items.Clear;
end;
//Отобразить дерево
procedure TForm1.Button2Click(Sender: TObject);
Var
kl: integer;
begin
kl:=-1;
TreeView1.Items.Clear;
ViewTree(Proot, kl);
TreeView1.FullExpand;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
//Вот сдесь нужно вывести число листьев на каждом уровне дерева.
end;
end.