IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Проблема с деревом, как формализовать?
Atreides
сообщение 10.06.2005 17:16
Сообщение #1


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


У меня тут задание сделать дерево, найти самый минимальный элемент, я это сделал, но еще надо определить отрицательное ли id значение корня, как это сделать. И еще как сделать, что бы вводить значение элементов в окне консоли, а не в коде проги? Вот код моей проги.
Код


program derevo;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 PItem=^TItem;   {перечисление и описание типов }
 TItem=record
 Id:integer;
 Left:Pitem;
 Right:Pitem;
 Parent:Pitem;
 end;

var
root:PItem;       {описание переменных, корень переменная}

 function FindNode(var Root:PItem;Idname:integer):PItem; {функция обхода всех элементов дерева}
var
{s:=integer;}
RetNode:PItem; state:byte;
begin
{s:=0;
s:=s+root.id; }
RetNode:=root;
State:=0;
if Root<>Nil then
 begin
 while true do
   begin
   if Retnode.Id=idname then break;
   if(retnode.Left<>nil)and (State<1)then
     begin
     RetNode:=RetNode.Left;
     {s:=s+retnode.id;}
     State:=0;
     end
     else
     begin
     if (retnode.Right<>nil)and (State<2)then
       begin
       retnode:=retnode.Right;{s:=s+retnode.id;}
       state:=0;
       end
       else
         begin
         if retnode.Parent<>nil then
           begin
           if retnode=retnode.Parent.left then
           state:=1
           else
           state:=2;
           retnode:=retnode.Parent;
           end
           else
             begin
             retnode:=nil;
             break;
             end;
           end;
         end;
       end;
     end;
result:=RetNode;
end;

procedure addnode(var root:PItem;id1,id2:integer);
var
NNode:PItem;
CNode:PItem;
begin Getmem(NNode,sizeof (TItem));
NNode.Id:=id1;
NNode.left:=nil;
NNode.right:=nil;
if root<>nil then
begin
if FindNode(root,id1)<>nil then
writeln ('takoi element uze est')
else
cnode := findnode(root,id2);
if cnode = nil then
writeln(' not find node')
else
if cnode^.left =nil then
begin
cnode.left:= nnode;
nnode.Parent :=cnode
end
else
if cnode^.right =nil then
begin
cnode.right:= nnode;
nnode.Parent :=cnode
end
else
writeln('vse elementi ZANATI NA UZLE');
END
else
begin
root := nnode;
end;
end;

procedure Viv_Tree(root:pitem;level:integer=0);
begin
inc(level);
if root = nil then
begin
writeln('element otsutstvuet');
exit;
end
else begin
write('id  ' + inttostr(root.id));
write('  uroven  ' + inttostr(level));
writeln;
if root.left <> nil then
Viv_Tree(root.left,level);
if root.right <> nil then
Viv_Tree(root.right,level);
end;
end;
function Findmin(var Root:PItem;Idname:integer):PItem; {функция обхода всех элементов дерева}
var
{s:=integer;}
RetNode:PItem; state:byte;
min:integer;
begin
{s:=0;
s:=s+root.id; }
RetNode:=root;
State:=0;
min:=root.id;
if Root<>Nil then
 begin
 while true do
   begin
   if Retnode.Id=idname then break;
   if(retnode.Left<>nil)and (State<1)then
     begin
     RetNode:=RetNode.Left;
     {s:=s+retnode.id;}
     State:=0;
     end
     else
     begin
     if (retnode.Right<>nil)and (State<2)then
       begin
       retnode:=retnode.Right;{s:=s+retnode.id;}
       state:=0;
       end
       else
         begin
         if retnode.Parent<>nil then
           begin
           if retnode=retnode.Parent.left then
           begin
           state:=1;
           if retnode.Id < min then min:=retnode.Id;
           end
           else
           begin
           state:=2;
           if retnode.Id < min then min:=retnode.Id;
           end;

           retnode:=retnode.Parent;
           end
           else
             begin
             retnode:=nil;
             break;
             end;
           end;
         end;
       end;
     end;
result:=RetNode;
writeln('min= ', min);
end;


begin
addnode(root,-1,2);
addnode(root,2,-1);
addnode(root,8,-1);
addnode(root,4,2);
addnode(root,7,2);
addnode(root,9,8);
addnode(root,3,8);
readln;
Viv_Tree(root);
writeln;
Findmin(root,3);
writeln;
readln;
end.


Сообщение отредактировано: Atreides - 10.06.2005 17:17


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.06.2005 20:17
Сообщение #2


Гость






Цитата(Atreides @ 10.06.05 17:16)
надо определить отрицательное ли  id значение корня, как это сделать.
Ну, так и пиши:
If root.id < 0 then { отрицательное }

Цитата(Atreides @ 10.06.05 17:16)
как сделать, что бы вводить значение элементов в окне консоли, а не в коде проги?
Добавляй функцию (вводи -999 для окончания ввода узлов):
function add_node: boolean;
var id_1, id_2: integer;
begin
writeln('Новый узел:')
write('Первый id = '); readln(id_1);
if id_1 <> -999 then begin
write('Второй id = '); readln(id_2);
addnode(root, id_1, id_2);
end;
result := (id_1 = -999);
end;

{ и меняй основную программу вот так: }
begin
repeat
until add_node;

Viv_Tree(root);
writeln;
Findmin(root,3);
writeln;
readln;
end.
 К началу страницы 
+ Ответить 
Atreides
сообщение 11.06.2005 11:07
Сообщение #3


Ветеран Броуновского Движения
***

Группа: Пользователи
Сообщений: 281
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


А в каком именно месте это прописывать?
Цитата
Ну, так и пиши:

Код
If root.id < 0 then { отрицательное }

Первый id – это значение элемента, а второй id – это значение элемента к которому происходит присоединение, я правильно понял? И я могу ввести неограниченное количество узлов и элементов пока не введу значение -999, так?


--------------------
Отрадно спать, отрадней камнем быть, О, этот век, преступный и постыдный, Не жить, не чувствовать - удел завидный. Прошу, молчи, не смей меня будить!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.06.2005 11:31
Сообщение #4


Гость






Цитата(Atreides @ 11.06.05 11:07)
А в каком именно месте это прописывать?
Там, где тебе нужно определить, отрицательный ли ID у корня, там и прописывай !!! Я же не знаю логики твоей программы, когда именно это тебе нужно... Может здесь:
  Findmin(root,3);
writeln;
if root.ID < 0 then writeln('ID корня отрицателен') else {<--- }
writeln('ID корня положителен или = 0');
readln;
а может где-нибудь раньше, сразу после ввода данных...

Цитата(Atreides @ 11.06.05 11:07)
Первый id –  это значение элемента, а второй id – это значение элемента к которому происходит присоединение, я правильно понял?
:yes: Раньше у тебя быпо:
addnode(root, {Первый ID}, {Второй ID});

Как только ты введешь {Первый ID} = -999, ввод данных прекратится...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 7:35
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"