Здравствуйте, помогите написать программный код, как сделать с помощью указателей бинарное дерево, с возможностью вставки, удаления элемента, поиском по индексу и переупорядочиванием"У меня через окно Edit задаётся, размерность массива, далее он заполняется случайными числани и выводится в метку, напишите как дальше связать кодом элементы массива с деревом, по принципу: берётся первый элемент массива, мы присваиваем ему значение вершины дерева, затем от него в лево или вправо распределяем последущие элементы массива, далее переупорядочивание до идеально-сбалансированного дерева, и код процедур вставки элемента и удаления. | Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Label2: TLabel; Button2: TButton; Button3: TButton; Button4: TButton; Label1: TLabel; Button5: TButton; Label3: TLabel; Button6: TButton; Button7: TButton; Button8: TButton; Edit1: TEdit; Button9: TButton; procedure Button9Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button7Click(Sender: TObject);
private { Private declarations } public { Public declarations } end; pnode=^tnode; tnode=record nextl,nextr:pnode; {Создание списка двумя ссылками на следующие элементы} val:integer; x,y:integer; {координаты по которым элементы списка будут выводиться на канвас} end;
var Form1: TForm1; beg,nextl,nextr:pnode; {объявление глобальных переменных} {объявление процедyр} procedure readnode(p:pnode); procedure readtree (p:pnode); procedure pastenode (p:pnode); procedure cutnode (p:pnode); procedure searchnode (p:pnode); procedure rewritenode (p:pnode); implementation
{$R *.dfm} procedure createtree(p:pnode;n:integer); begin {if n=0 then begin exit; end //создание дерева else begin //создание левого и правого элемента p.val:=n; new(nextl); new(nextr); p.nextl:=nextl; //Задание координат левого и правого края от вершины nextl.x:=p.x-10; nextl.y:=p.y+10; nextr.x:=p.x+10; nextr.y:=p.y+10; p.nextr:=nextr; nextr.nextl:=nil; nextl.nextl:=nil; nextr.nextr:=nil; nextl.nextr:=nil; //каждый нисходящий элемент уменьшается на единичку createtree(nextl,n-1); createtree(nextr,n-1); end;} end;
procedure DisposeTree(p:pnode); //Как только последние элементы справа и слева nil, то выход begin {if (p.nextl=nil) or (p.nextr=nil) then begin exit; end else begin Disposetree(p.nextl); disposetree(p.nextr); dispose(P); end;} end;
procedure TForm1.Button1Click(Sender: TObject); begin //создаём корень дерева {new(beg); beg.x:=100; beg.y:=50; beg.val:=1000; createtree(beg,5); label1.Caption:=''; readtree(beg); } end;
procedure readnode(p:pnode); //Как только последние элементы справа и слева nil, то выход begin {if (p.nextl=nil) or (p.nextr=nil) then begin exit; //Если же элементы не равны nil, то выводим во 2ю метку значение p.val, через запятую end else begin form1.Label2.Caption:=form1.Label2.Caption+inttostr(p.val)+' '; //считываем последующие элементы дерева readnode(p.nextl); readnode(p.nextr); end;} end;
procedure readtree(p:pnode); //Вывод дерева через ф-цию Canvas на форму begin {if (p.nextl=nil) or (p.nextr=nil) then begin exit; end else begin readtree(p.nextl); readtree(p.nextr); form1.Canvas.TextOut(p.x,p.y,inttostr(p.val)); end;} end;
procedure pastenode (p:pnode); begin
end;
procedure cutnode (p:pnode); begin {//Удаление элемента var i, first_link, last_link:integer; parent_node, parent_link:integer; begin //Нахождение родительского узла parent_node:=Node^[Selected].parent; first_link:=Node^[parent_node].FirstLink; last_link:=Node^[parent_node+1].FirstLink-1; for parent_link := first_link to last_link do if (ToNode^[parent_link=Selected) then break;
//Если родительский узел найден, то удаляем его if (parent_link<=last_link) then begin //Заполнение пустого места в массиве ToNode parent_link to NumLiпks-1 do ТоNоdе^[i] := ToNode"[i+1]; NumLinks := NumLinks -1; // Не стоит изменять размеры массива ToNode. // Обновление записей массива FirstLiпk. for i : = 1 to NumNodes do if (Nоdе^[i].FirstLink>parent_link) then Nоdе^[i].FirstLink := Nоdе^[i].FirstLiпk-1; // Удаление самого узла заполнением пустого места в массиве ToNode. for i := Selected to NumNodes-l do Nоdе^[i] :=Nоdе^[i+1] NumNodes := NumNodes-1; // Обновление записей массива ToNode. for i := 1 to NumLinks do if (ТоNоde^[i] >Selected) then ТоNоdе^[i]:= ToNode^[i]-1; Selected : = 0 ; end; end; end;} end;
procedure searchnode (p:pnode); begin
end;
procedure rewritenode (p:pnode); begin
end;
procedure TForm1.Button2Click(Sender: TObject); begin {readnode(beg);} end;
procedure TForm1.Button3Click(Sender: TObject); begin {readtree(beg);} end;
procedure TForm1.Button4Click(Sender: TObject); begin {DISPOSE(beg);} end;
procedure TForm1.Button5Click(Sender: TObject); begin form1.Close; end;
procedure TForm1.Button7Click(Sender: TObject); begin
end;
procedure TForm1.Button8Click(Sender: TObject); {Очищение меток} begin Label1.Caption :=' '; Label2.Caption :=' '; end;
procedure TForm1.Button9Click(Sender: TObject); {Получение размерности массива из окна Edit1, заполнение случайными числами и вывод в метку 3} var Mas:array of integer; z:integer; begin label3.Caption:=''; setlength(Mas,strtoint(edit1.text)); for z:=0 to strtoint(edit1.Text)-1 do begin mas[z]:=random(10); label3.Caption:=label3.caption+' '+inttostr(Mas[z]);
end; end; end.
|
]
|