
20.05.2013, 19:21
|
Прохожий
|
|
Регистрация: 20.05.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
|
|
помогите с балансировкой дерева
Прошу помощи с балансировкой бинарного упорядоченного дерева, да и вообще, все ли правильно с кодом? не знаю как сделать балансировку созданого вручную дерева при нажатии на клавишу "сбалансировать дерево"...помогите с этим, пожалуйста
Код:
unit UmainBtree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan, ComCtrls, ExtCtrls;
type
Tpoint = ^Tree; // Описывает тип будущего дерева
Tree = record // Тип запись в котором будет храниться информация
Tdata: integer;
TLefEl: Tpoint; // левая часть
TRightEl: Tpoint; // правая часть
end;
TForm1 = class(TForm)
Edit1: TEdit;
BtnAddToTree: TButton;
Edit2: TEdit;
BtnShowTree: TButton;
XPManifest1: TXPManifest;
TreeView1: TTreeView;
Panel1: TPanel;
Label1: TLabel;
Button1: TButton;
Button4: TButton;
procedure BtnAddToTreeClick(Sender: TObject); // процедура добавления элемента в дерево
procedure BtnShowTreeClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject); // закрытие программы
procedure Button4Click(Sender: TObject); // балансировка дерева
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
root: Tpoint = nil;
CountEl:integer = 0;
implementation
{$R *.dfm}
{Процедура добавления элемента }
procedure AddTreeElement(el: integer; Var Troot:Tpoint); // адрес корня дерева и добавленный элемент
begin
if Troot = nil then // если дерево пустое, то создаём его корень
begin
new(Troot); // выделяем память под дерево
Troot^.Tdata:=el; // добавляем данные
Troot^.TLefEl:=nil;
Troot^.TRightEl:=nil;
end else
begin
if el <= Troot^.Tdata then // распределение по ветвям
AddTreeElement(el, Troot^.TLefEl) else // если введенный эл-т меньше - левая ветвь
AddTreeElement(el, Troot^.TRightEl) ; // если введенный эл-т меньше - правая ветвь
end;
end;
{Вывод дерева в компонент TreeView}
procedure vyvid(root:Tpoint; item:TTreeNode);
var tmpItem:TTreeNode;
begin
if root<>nil then
begin
tmpItem:=Form1.TreeView1.Items.AddChild(item,inttostr(root^.Tdata));
vyvid(root^.TLefEl, tmpItem);
vyvid(root^.TRightEl, tmpItem);
end
end;
procedure ShowTree; // показ дерева
begin
Form1.TreeView1.Items.Clear;
if root <> nil then // если корень пуст
begin
vyvid(root, nil);
Form1.TreeView1.FullExpand; // расширение изображения
end;
end;
procedure TForm1.BtnAddToTreeClick(Sender: TObject);
var h:integer;
begin
{Проверка на целостность введенного числа}
If (Not TryStrToInt(Edit1.Text,h)) Then
Begin
ShowMessage('Ошибка! Введите целое число!'); // вывод сообщения об ошибке
Exit;
End else // в другом случае:
begin
h:=StrToInt(Edit1.Text); // ввод в edit1 целого числа
AddTreeElement(h, root); // добавление элементов
Edit1.Text:='';
CountEl:=CountEl+1; // кол-во элемнтов в дереве
Edit2.Text:=IntToStr(CountEl); // вывод в edit2 кол-во эл-в в дереве
Edit1.setfocus;
ShowTree; // показ дерева
end;
end;
procedure TForm1.BtnShowTreeClick(Sender: TObject); // нажатие на кнопку "Показать"
begin
TreeView1.Items.Clear;
if root = nil then ShowMessage('Пустое дерево!') else
ShowTree; // показ дерева
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.setfocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;
end.

|