|
|
Регистрация | << Правила форума >> | 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
З.Ы. Обидеть не хотел, просто радость за прогресс Я не понял Вашего вопроса, но всё же Вам на него отвечу! |