Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58

Поиск минимальной глубины бинарного дерева

27.04.2013, 14:30. Показов 3261. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Помогите пожалуйста найти минимальную глубину бинарного дерева. Как именно это сделать? + как сделать так, чтобы при нажатии на кнопку "удалить" удаляло все элементы дерева с заданым значением? (key). Вот то, что имеется у меня на данный момент:
Delphi
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls;
 
type
 Tpoint = ^Tree;
  Tree = record
    Tdata: integer;
    TLefEl: Tpoint;
    TRightEl: Tpoint;
  end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    BtnAddToTree: TButton;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    BtnShowTree: TButton;
    BtnFindMinDBTree: TButton;
    BtnExit: TButton;
    XPManifest1: TXPManifest;
    TreeView1: TTreeView;
    Label4: TLabel;
    Edit4: TEdit;
    BtnDelElement: TButton;
    procedure BtnAddToTreeClick(Sender: TObject);
    procedure BtnExitClick(Sender: TObject);
    procedure BtnShowTreeClick(Sender: TObject);
    procedure vyvid(root:Tpoint; item:TTreeNode);
    procedure BtnDelElementClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  root: Tpoint;
  i:integer;
 
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);
    if el > Troot^.Tdata then AddTreeElement(el,  Troot^.TRightEl) ;
  end;
end;
 
{Выведем дерево в компонент TreeView}
procedure TForm1.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;
 
{Функция поиска по дереву}
function find(root:Tpoint; key:integer; var p,parent:Tpoint) : BOOLEAN;
begin
  p := root;       // Поиск с корня
  while p<>nil do
    begin
      if key = p^.Tdata then   // узел с таким ключом найден.
         begin
           find:=true;
           exit;
         end;
      parent:=p;              //запомним указатель перед спуском.
      if key < p^.Tdata then p:=p^.TLefEl  //спустились вправо
                       else p:=p^.TRightEl;  //спустились влево
    end;
  find:=false;
end;
 
{Спуск по дереву}
  function Descent (p:Tpoint):Tpoint;
  var y: Tpoint;       //узел, который заменяет удаляемый
      prev: Tpoint;     //предок узла у
  begin
    y:=p^.TRightEl;
    if y^.TLefEl = nil
    then y^.TLefEl := P^.TLefEl
     else
       begin
         repeat
           prev := y;
           y:=y^.TLefEl;
         until y^.TLefEl =nil;
       end;
    descent:=y;
  end;
 
{Процедура удаления элемента из дерева}
procedure Del(var root:Tpoint; key:integer);
var p: Tpoint;         //удаляемый узел
    parent:Tpoint;     //предок удаляемого узла
    y:Tpoint;          //узел, который заменяет удаляемый узел
begin
    if not find (root, key, p, parent)
     then
       begin
       ShowMessage('such element does not exist');
       end;
 
    if p^.TLefEl=nil
    then y:=p^.TRightEl
    else if p^.TRightEl = nil
           then y:=p^.TLefEl
           else y:=descent(p);
    if p = root then root:=y
    else
       if key < parent^.Tdata
       then parent^.TLefEl := y
       else parent^.TRightEl := y;
    dispose(p);
  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);
    AddTreeElement(h, root);
    Edit1.Text:='';
    i:=i+1;   //количество элементов в дереве
    Edit2.Text:=IntToStr(i);
    Edit1.setfocus;
  end;
end;
 
procedure TForm1.BtnExitClick(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.BtnShowTreeClick(Sender: TObject);
var Item:TTreeNode;
begin
  TreeView1.Items.Clear;
  item:=nil;
  if root = nil then ShowMessage('The Tree is Empty =(')
                else vyvid(root, Item)
end;
 
procedure TForm1.BtnDelElementClick(Sender: TObject);
begin
 If Edit4.Text='' then ShowMessage('Введите элемент, который нужно удалить')
                  else del(root, strtoint(Edit4.text)); //удаляем элемент
end;
 
 
procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1.setfocus;
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.04.2013, 14:30
Ответы с готовыми решениями:

Поиск по бинарному дереву, построение бинарного дерева
Сделал 3 процедуры: 1. строит бинарное дерево 2. рекурсивная процедура помогает 1-ой найти необходимую позицию (она то и неправильно...

Расчет глубины бинарного дерева!
Всем привет, можете помочь, нужно написать расчет глубины бинарного дерева, я вообще не представляю как это написать, помогите пожалуйста!

Определение максимальной глубины бинарного дерева
Помогите написать процедуру нахождения максимальной глубины дерева program project1; {$mode objfpc}{$H+} uses Classes,...

12
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
27.04.2013, 20:50  [ТС]
Ап, всё так же нуждаюсь в помощи, уже обыскался "все интернеты"
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
27.04.2013, 21:15
Вот, кажется, так будет поиск минимальной глубины:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function TreeMinDepth(Root: Tpoint): integer; 
var
  LMax: integer;
procedure NodeLevel(P: Tpoint; L: integer);
begin
  if P = nil then
  begin
    if (LMax = 0) or (L < LMax) then
    LMax := L;
    exit;
  end;
  NodeLevel(P^.Left, L + 1);
  NodeLevel(P^.Right, L + 1);
end;
begin
  LMax := 0;
  NodeLevel(Root, 0);
  Result := LMax;
end;
И после строки 123 твоего кода нужно вставить Exit.
1
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
27.04.2013, 21:25  [ТС]
И все же, минимальную глубину вычисляет не правильно. Я тут кое-что правда поменял, но причина фейла пока мне не известна)
+ как сделать, чтобы за 1 нажатием удаляло все элементы по key. например в дереве 10 элементов со значением 2, и нужно все сразу удалить 2-ки.
Вложения
Тип файла: rar 5.1.rar (190.1 Кб, 15 просмотров)
0
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
27.04.2013, 21:36  [ТС]
Точнее: минимальная глубина почему-то всегда 2.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.04.2013, 04:30
Тестируй:
Вложения
Тип файла: rar Бинарное дерево_.rar (3.9 Кб, 82 просмотров)
1
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
28.04.2013, 10:59  [ТС]
Всё отлично) Спасибо Вам )
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.04.2013, 16:43
В проекте была ошибка. Привожу, чтобы кто другой ещё не нарвался:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Удаление заданного узла p
procedure DeletePoint(Var root,p,parent:Tpoint);
Var
  key:Integer;
    y:Tpoint;          //узел, который заменяет удаляемый узел
begin
  key:=p^.Tdata;
  if p^.TLefEl=nil then
  y:=p^.TRightEl else
  if p^.TRightEl = nil then
  y:=p^.TLefEl else
  begin
    y:=descent(p,parent);
    p^.Tdata:=y^.Tdata;
    DeletePoint(root,y,parent);
    exit;
  end;
 
  if p = root then root:=y else
  if key <= parent^.Tdata then //Вот здесь была ошибка !!!!!!!!!!!!!!!!!!!!!!
  parent^.TLefEl := y else
  parent^.TRightEl := y;
  dispose(p);
end;
Добавлено через 2 часа 22 минуты
Полностью заменил удаление. Нашел в интернете почти готовый код:
http://volvo71.narod.ru/faq_fo... ee_delnode
Вроде работает нормально.
И ещё добавил уничтожение дерева при завершении программы.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33182 / 21480 / 8231
Регистрация: 22.10.2011
Сообщений: 36,849
Записей в блоге: 12
28.04.2013, 17:47
Цитата Сообщение от Одиночка Посмотреть сообщение
почти готовый код:
Можно уточнить, а что именно "почти" в моем коде? Оно вообще-то полностью функционально (правда написано было на Турбо-Паскале, может, в Дельфи есть какие-то нюансы)
2
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
28.04.2013, 17:54  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Можно уточнить, а что именно "почти" в моем коде? Оно вообще-то полностью функционально (правда написано было на Турбо-Паскале, может, в Дельфи есть какие-то нюансы)
Вполне возможно, что @Одиночка имел ввиду, что код из того сайта нужно чуть адаптировать под мою программу, а именно: поменять имена указателей и тому подобный "косметический ремонт". А так то я уже всё опробовал и пришел к выводу: Всем спасибо и хорошего дня!
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
28.04.2013, 17:56
А, это твой код UI? Спасибо. Да, он полностью рабочий. Под "почти", я имел в виду переработку, чтобы вставить в этот проект. В основном только идентификаторы и типы поменял. Да ещё вставил признак, чтобы если удаляемый ключ был найден - на выходе True.
0
 Аватар для Antracut
193 / 6 / 1
Регистрация: 01.10.2012
Сообщений: 58
29.04.2013, 15:12  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Можно уточнить, а что именно "почти" в моем коде? Оно вообще-то полностью функционально (правда написано было на Турбо-Паскале, может, в Дельфи есть какие-то нюансы)
Вашу процедуру удаления дерева пришлось модефицировать, так как при ней вылетали ошибки.
Окончательный вариант вышел таким:
Delphi
1
2
3
4
5
6
7
8
9
10
Procedure DeleteTree(var T: TPoint);
Begin
  If T <> nil Then
  begin
    DeleteTree(T^.TRightEl);
    DeleteTree(T^.TLefEl);
    Dispose(T);
    T:=nil;
  end;
End;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33182 / 21480 / 8231
Регистрация: 22.10.2011
Сообщений: 36,849
Записей в блоге: 12
29.04.2013, 15:17
Здесь записано ровно то же самое, что и в исходном коде, оттого, что ты поменял условие на обратное - ничего не изменилось, просто код стал менее читабельным (ан фиг тут еще один уровень вложенности - непонятно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2013, 15:17
Помогаю со студенческими работами здесь

Вычисление глубины бинарного дерева на Arity Prolog
Пожалуйста помогите дописать буквально пару строчек в коде!!! вот код: max(R1,R2,Max):- R1&gt;=R2, Max=R1. max(R1,R2,Max):-...

Вычисления глубины бинарного дерева в Turbo Prolog
Написать программу для вычисления глубины бинарного дерева (глубина пустого дерева равна 0, глубина одноузлового дерева равна 1). даже не...

Определить функцию для вычисления глубины бинарного дерева
Дано S-выражение, представляющее дерево вида «(РебенокЛевый Родитель РебенокПравый)». Определить функцию для вычисления глубины этого...

Определить функцию для вычисления глубины бинарного дерева
Здравствуйте, помогите пожалуйста с написанием программы на F# (visual studio 2010): Определить функцию для вычисления глубины бинарного...

Определить функцию для вычисления глубины бинарного дерева
Вообщем вот такая задачка: Определить функцию для вычисления глубины бинарного дерева (глубина пустого дерева равна 0, глубина...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru