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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2011, 16:30   #1
Kinect
 
Регистрация: 08.05.2011
Сообщений: 5
По умолчанию TTreeView (Бинарное дерево)

Привет ребята!
Есть задание:
Написать программу (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.
Вложения
Тип файла: zip New folder.zip (11.1 Кб, 77 просмотров)
Kinect вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарное дерево С++ mego4el Помощь студентам 0 15.03.2011 20:47
Бинарное дерево С++ Voxa7 Помощь студентам 0 17.05.2010 18:59
Бинарное дерево) Svetlanka_ya Помощь студентам 0 17.04.2010 11:13
Бинарное дерево lubafffka Общие вопросы C/C++ 0 29.04.2009 12:28
Бинарное дерево g0liath Помощь студентам 2 16.02.2008 23:54