Добавлен: 29.03.2023
Просмотров: 147
Скачиваний: 2
СОДЕРЖАНИЕ
1 Динамические структуры данных
1.1 Введение в динамические структуры данных
1.2 Классификация динамических структур данных. Бинарные деревья
1.3 Операции над бинарным деревом
2 Создание программного средства для работы с двоичными деревьями
2.1 Понятие динамической библиотеки
2.2 Создание динамической библиотеки для работы с бинарными деревьями
library binarytree;
uses
SysUtils,
Classes, Dialogs;
{$R *.res}
type
TInfo = Byte;
PItem = ^Item;
Item = record
Key: TInfo;
Left, Right: PItem;
end;
procedure InLeft (var P: PItem; X : TInfo); export;//добавление узла слева
var R : PItem;
begin
New(R);
R^.Key := X;
R^.Left := nil;
R^.Right := nil;
P^.Left := R;
end;
procedure InRight (var P: PItem; X : TInfo); export;//добавить узел справа
var R : PItem;
begin
New(R);
R^.Key := X;
R^.Left := nil;
R^.Right := nil;
P^.Right := R;
end;
procedure Tree_Add (P: PItem; X : TInfo); export;
var OK: Boolean;
begin
OK := false;
while not OK do begin
if X > P^.Key then //посмотреть направо
if P^.Right <> nil //правый узел не nil
then P := P^.Right //обход справа
else begin //правый узел – лист и надо добавить к нему элемент
InRight (P, X); //и конец
OK := true;
end
else //посмотреть налево
if P^.Left <> nil //левый узел не nil
then P := P^.Left //обход слева
else begin //левый узел -лист и надо добавить к нему элемент
InLeft(P, X); //и конец
OK := true
end;
end; //цикла while
end;
procedure Delete (var P: PItem; X: TInfo); export;
var Q: PItem;
procedure Del(var R: PItem);
//процедура удаляет узел, имеющий двух потомков, заменяя его на самый правый
//узел левого поддерева
begin
if R^.Right <> nil then //обойти дерево справа
Del(R^.Right)
else begin
//дошли до самого правого узла
//заменить этим узлом удаляемый
Q^.Key := R^.Key;
Q := R;
R := R^.Left;
end;
end; //Del
begin //Delete
if P <> nil then //искать удаляемый узел
if X < P^.Key then
Delete(P^.Left, X)
else
if X > P^.Key then
Delete(P^.Right, X) //искать в правом поддереве
else begin
//узел найден, надо его удалить
//сохранить ссылку на удаленный узел
Q := P;
if Q^.Right = nil then
//справа nil
//и ссылку на узел надо заменить ссылкой на этого потомка
P := Q^.Left
else
if Q^.Left = nil then
//слева nil
//и ссылку на узел надо заменить ссылкой на этого потомка
P := P^.Right
else //узел имеет двух потомков
Del(Q^.Left);
Dispose(Q);
end
else
MessageDlg('Такого элемента нет в дереве',mtError,[mbOK],0);
end;
exports InLeft,InRight,Tree_Add,Delete;
begin
end.
Листинг основной программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TInfo = Byte;
PItem = ^Item;
Item = record
Key: TInfo;
Left, Right: PItem;
end;
TTree = class
private
Root: PItem;
public
constructor Create;
procedure Add(Key: TInfo);
procedure Del(Key: TInfo);
procedure View;
procedure Exist(Key: TInfo);
end;
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
Button2: TButton;
Button3: TButton;
Button5: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Root: PItem;
Tree: TTree;
N: Byte;
err: boolean;
Key: TInfo;
procedure InLeft (var P: PItem; X : TInfo); external 'binarytree.dll'
procedure InRight (var P: PItem; X : TInfo); external 'binarytree.dll'
procedure Tree_Add (P: PItem; X : TInfo);external 'binarytree.dll'
procedure Delete (var P: PItem; X: TInfo); external 'binarytree.dll'
implementation
{$R *.dfm}
constructor TTree.Create;
begin
Root := nil;
end;
procedure TTree.Add(Key: TInfo);
procedure IniTree(var P: PItem; X: TInfo); //создание корня дерева
begin
New(P);
P^.Key :=X;
P^.Left := nil;
P^.Right := nil;
end;
begin
if Root = nil
then IniTree(Root, Key)
else Tree_Add(Root, Key);
end;
procedure TTree.Del(Key: TInfo);
begin
Delete(Root, Key);
end;
procedure TTree.View;
procedure PrintTree(R: PItem; L: Byte);
var i: Byte;
begin
if R <> nil then begin
PrintTree(R^.Right, L + 3);
for i := 1 to L do
Form1.ListBox1.Items[Form1.ListBox1.Count-1]:=Form1.ListBox1.Items[Form1.ListBox1.Count-1]+' ';
Form1.ListBox1.Items[Form1.ListBox1.Count-1]:=Form1.ListBox1.Items[Form1.ListBox1.Count-1]+inttostr(R^.Key);
Form1.ListBox1.Items.Add('');
PrintTree(R^.Left, L + 3);
end;
end;
begin
Form1.ListBox1.Items.Add('');
PrintTree (Root, 1);
end;
procedure TTree.Exist(Key: TInfo);
procedure Search(var P: PItem; X: TInfo);
begin
if P = nil then begin
MessageDlg('Not Found Element',mtError,[mbOK],0);
end else
if X > P^. Key then //ищется в правом поддереве
Search (P^. Right, X)
else
if X < P^. Key then
Search (P^. Left, X)
else
MessageDlg('Found Element', mtCustom,[mbOK],0);
end;
begin
Search(Root, Key);
end;
procedure InputKey(S: String; var Key: TInfo);
begin
WriteLn(S);
ReadLn(Key);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Tree := TTree.Create;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.ListBox1.Clear;
if Edit1.Text = '' then else
Key:=strtoint(Edit1.Text);
Tree.Add(Key);
Tree.View;
Edit1.Clear;
Edit1.SetFocus;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.ListBox1.Clear;
if Edit1.Text = '' then else
Key:=strtoint(Edit1.Text);
Tree.Del(Key);
Tree.View;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
err:=False;
try
Key:=strtoint(Edit1.Text);
err:=False;
except
err:=True;
ShowMessage('Значение узла не введено. Программа завершает работу');
Application.Terminate;
end;
Tree.Exist(Key);
end;
end.
-
Информатика: Уч. / В.А.Каймин - 6 изд. -М.: НИЦ ИНФРА-М, 2016 -285с. ↑
-
Информатика, автоматизированные информационные технологии и системы: Учебник / В.А. Гвоздева. - М.: ИД ФОРУМ: НИЦ ИНФРА-М, 2015. - 544 с. ↑
-
Базовые средства программирования/ В.Н. Шакин. - М.: Форум: НИЦ ИНФРА-М, 2015. - 304 с. ↑
-
Алгоритмы. Вводный курс/ Томас Х. Кормен М.: Вильямс, 2015. – 208с. ↑
-
Программирование на языке высокого уровня. Учебное пособие / Т.И. Немцова; Под ред. Л.Г. Гагариной. - М.: ФОРУМ: ИНФРА-М, 2015. - 496 с. ↑
-
Информатика: Уч. / В.А.Каймин - 6 изд. -М.: НИЦ ИНФРА-М, 2016 -285с. ↑
-
Стивенс Род - Алгоритмы. Теория и практическое применение – М.: ЭКСМО, 2016. – 544 с. ↑
-
Дискретная математика для программистов / Гэри Хаггард, Джон Шлипф, Сью Уайтсайдс – М.: Бином. Лаборатория знаний, 2017. – 632с. ↑
-
Иерархические структуры данных: бинарные деревья. Учебное пособие по дисциплине «Информатика» / А.В. Никитин, Т.Н. Ничушкина - М.: МГТУ имени Н.Э. Баумана, 2017. – 60 с. ↑
-
Структуры данных – деревья – [Электронный ресурс] – режим доступа: https://pro-prof.com/archives/682 (дата обращения: 05.12.2020) ↑
-
Кормен Томас Алгоритмы. Построение и анализ / Томас Кормен, Чарльз Лейзерсон, Рональд Риверст, Клиффорд Штайн – М.: Вильямс, 2016. – 1328с. ↑
-
Кормен Томас Алгоритмы. Построение и анализ / Томас Кормен, Чарльз Лейзерсон, Рональд Риверст, Клиффорд Штайн – М.: Вильямс, 2016. – 1328с. ↑
-
Стивенс Род - Алгоритмы. Теория и практическое применение – М.: ЭКСМО, 2016. – 544 с. ↑
-
Иерархические структуры данных: бинарные деревья. Учебное пособие по дисциплине «Информатика» / А.В. Никитин, Т.Н. Ничушкина - М.: МГТУ имени Н.Э. Баумана, 2017. – 60 с. ↑
-
Бинарные деревья [Электронный ресурс] – режим доступа: http://www.codenet.ru/progr/alg/ btree.php (дата обращения: 05.12.2020) ↑
-
Программирование на языке высокого уровня. Учебное пособие / Т.И. Немцова; Под ред. Л.Г. Гагариной. – М.: ФОРУМ: ИНФРА-М, 2015. – 496 с. ↑
-
Голицына О.Л. Языки программирования: Учебное пособие / О.Л. Голицына, Т.Л. Партыка, И.И. Попов. – 3-e изд., перераб. и доп. – М.: Форум: ИНФРА-М, 2015. – 400 с. ↑