Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi]Операции над бинарными деверьями, создание, вставка эл, удаление эл, поиск 
:(
    Опции темы
Towguy
Дата 5.6.2008, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



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

У меня через окно 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
Код


.

]
PM MAIL   Вверх
masternard
Дата 5.6.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 47
Регистрация: 10.1.2008

Репутация: нет
Всего: нет



Делал прогу недавно. Может поможет.
http://slil.ru/25867675
PM   Вверх
Towguy
Дата 5.6.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 5.6.2008

Репутация: нет
Всего: нет



Благодарю, программа отлично работает с добавлением, удалением элементов и перерисовывает дерево сразу - она очень помогла. Щас разберусь во всём хорошенько и свою задачу начну писать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1904 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.