Показать сообщение отдельно
  #1  
Старый 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.
Ответить с цитированием