![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Прошу помощи с балансировкой бинарного упорядоченного дерева, да и вообще, все ли правильно с кодом? не знаю как сделать балансировку созданого вручную дерева при нажатии на клавишу "сбалансировать дерево"...помогите с этим, пожалуйста
Код:
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.![]() |
|
#2
|
||||
|
||||
|
Надо же, прогресс, с января в код добавилась аж целая процедура клика кнопки на выход
А что вы подразумеваете под балансировкой? В смысле какую, КЧД или AVL? На ум приходит ещё одна, колесная, но к дереву она явно не подходит. Поясните пжлст.З.Ы. Случайно это не то? А вот статья с нашего форума по теме. Здесь тоже есть, в "бумажном" варианте. Последний раз редактировалось Alegun, 21.05.2013 в 06:12. |
|
#3
|
|||
|
|||
|
Это мой же код. И это регистрация в январе, а сообщение выложено в мае. Спасибо за ссылочки. но блин, я уже столько перечитала а с кодом ну никак. мне всегда проще въехать в готовый код и понять. я как-то с созданием вообще не очень..
|
|
#4
|
||||
|
||||
|
Посмотрите тогда сначала визуальный вариант построения AVL
З.Ы. Обидеть не хотел, просто радость за прогресс ![]() |