Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с деревом
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Atreides
У меня тут задание сделать дерево, найти самый минимальный элемент, я это сделал, но еще надо определить отрицательное ли 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.
volvo
Цитата(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
А в каком именно месте это прописывать?
Цитата
Ну, так и пиши:

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

Первый id – это значение элемента, а второй id – это значение элемента к которому происходит присоединение, я правильно понял? И я могу ввести неограниченное количество узлов и элементов пока не введу значение -999, так?
volvo
Цитата(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, ввод данных прекратится...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.