Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.05.2013, 19:21
Громова Громова вне форума
Прохожий
 
Регистрация: 20.05.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию помогите с балансировкой дерева

Прошу помощи с балансировкой бинарного упорядоченного дерева, да и вообще, все ли правильно с кодом? не знаю как сделать балансировку созданого вручную дерева при нажатии на клавишу "сбалансировать дерево"...помогите с этим, пожалуйста
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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  
Старый 20.05.2013, 20:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Надо же, прогресс, с января в код добавилась аж целая процедура клика кнопки на выход А что вы подразумеваете под балансировкой? В смысле какую, КЧД или AVL? На ум приходит ещё одна, колесная, но к дереву она явно не подходит. Поясните пжлст.

З.Ы. Случайно это не то? А вот статья с нашего форума по теме. Здесь тоже есть, в "бумажном" варианте.

Последний раз редактировалось Alegun, 21.05.2013 в 06:12.
Ответить с цитированием
  #3  
Старый 21.05.2013, 09:48
Громова Громова вне форума
Прохожий
 
Регистрация: 20.05.2013
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Это мой же код. И это регистрация в январе, а сообщение выложено в мае. Спасибо за ссылочки. но блин, я уже столько перечитала а с кодом ну никак. мне всегда проще въехать в готовый код и понять. я как-то с созданием вообще не очень..
Ответить с цитированием
  #4  
Старый 21.05.2013, 10:26
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Посмотрите тогда сначала визуальный вариант построения AVL

З.Ы. Обидеть не хотел, просто радость за прогресс
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025