unit Uderevo;

interface

Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Buttons, Grids, ExtCtrls;

Type
Tinf = record
nomer : integer;
FIO : string;
end;
Type
PTree = ^TTree;
TTree = class
public
prnt : integer;
inf : Tinf;
L, R : TTree;
kluch : TTree;
Constructor Create();
Destructor Destroy();
public
procedure AddLeft(X : Tinf);
procedure AddRight(X : Tinf);
Procedure Add(X : Tinf);
Procedure View(TTreeView1 : TTreeView; level : integer = 0);
Function ToString() : string;
Function KeyFind(key : integer) : TTree;
Function KeyFindPred(key : integer) : TTree;
procedure Clear();
procedure Write(memo1 : Tmemo; _type : integer);
procedure Solve(edit3 : TEdit);
end;

const
prym = 1;
obrat = 2;
pokluchu = 3;
var
T : integer = 0;
max : integer = 0;
implementation

{ TDerevo }

procedure TTree.Add(X: Tinf);
var
tek, ver : TTree;
b : boolean;
begin
ver := self;
while (ver <> nil) do
begin
tek := ver;
b := X.nomer < tek.inf.nomer;
if b = true then
ver := ver.L
else
ver := ver.R;
end;
if b = true then
tek.AddLeft(X)
else
tek.AddRight(X);
end;

procedure TTree.AddLeft(X: Tinf);
begin
L := TTree.Create();
L.inf.nomer := X.nomer;
L.inf.FIO := X.FIO;
end;

procedure TTree.AddRight(X: Tinf);
begin
R := TTree.Create();
R.inf.nomer := X.nomer;
R.inf.FIO := X.FIO;
end;

procedure TTree.Clear;
begin
if L <> nil then
begin
L.Destroy;
L := nil;
end;
if R <> nil then
begin
R.Destroy;
R := nil;
end;
end;

constructor TTree.Create;
begin
L := nil;
R := nil;
inherited;
end;

destructor TTree.Destroy;
begin
if L <> nil then
begin
L.Destroy;
L := nil;
end;
if R <> nil then
begin
R.Destroy;
R := nil;
end;
end;

function TTree.KeyFind(key: integer): TTree;
var
tek : TTree;
begin
tek := self;
while ((tek <> nil) and (tek.inf.nomer <> key)) do
begin
if key < tek.inf.nomer then
tek := tek.L
else
tek := tek.R;
end;
result := tek;
end;

function TTree.KeyFindPred(key: integer): TTree;
var
ver, pred : TTree;
begin
ver := self;
pred := ver;
while ((ver <> nil) and (ver.inf.nomer <> key)) do
begin
pred := ver;
if key < ver.inf.nomer then
ver := ver.L
else
ver := ver.R;
end;
result := pred;
end;


procedure TTree.Solve(edit3: TEdit);
begin
if L <> nil then
begin
inc(T);
L.Solve(edit3);
end;
if R <> nil then
begin
inc(T);
R.Solve(edit3);
end;
if (L = nil) and (R = nil) then
begin
if T > max then
begin
max := T;
T := 0;
end;
end;
edit3.Text := inttostr(max + 1);
T := 0;
end;

function TTree.ToString: string;
begin
result := inf.FIO + ' ' + inttostr(inf.nomer);
end;

procedure TTree.View(TTreeView1: TTreeView; level: integer);
begin
if level = 0 then
begin
if (L <> nil) then
L.prnt := 0;
if (R <> nil) then
R.prnt := 0;
TTreeView1.Items.AddFirst(nil, ToString());
end
else
begin
ttreeview1.Items.AddChild(ttreeview1.Items[self.prnt], Tostring()); //что значит self.prnt
if (L <> nil) then
L.prnt := ttreeview1.Items.Count - 1; // почему именно так и что за prnt
if (R <> nil) then
R.prnt := ttreeview1.Items.Count - 1;
end;
inc(level);
if (L <> nil) then
L.View(ttreeview1, level);
if (R <> nil) then
R.View(ttreeview1, level);
end;

procedure TTree.Write(memo1: Tmemo; _type: integer);
begin
if _type = prym then
memo1.Lines.Add(Tostring());
if L <> nil then
L.Write(memo1, _type);
if _type = pokluchu then
memo1.Lines.Add((ToString));
if R <> nil then
R.Write(memo1, _type);
if _type = obrat then
memo1.Lines.Add(ToString());
end;



end.
Соседние файлы в папке макс глубина, поиск удаление по клбючу
  • #
    15.06.2014215 б13Katya.dpr
  • #
    15.06.2014214 б12Katya1.dpr
  • #
    15.06.20145.17 Кб12Uderevo.dcu
  • #
    15.06.20144.12 Кб12Uderevo.pas
  • #
    15.06.20144.11 Кб12Uderevo.~pas
  • #
    15.06.201410.59 Кб12Umain.dcu
  • #
    15.06.20145.62 Кб12Umain.dfm
  • #
    15.06.20145.43 Кб13Umain.pas
  • #
    15.06.20145.62 Кб12Umain.~dfm