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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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.
Ответить с цитированием
  #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, время: 19:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter