Помощь - Поиск - Пользователи - Календарь
Полная версия: Бинарное дерево
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Dunkel_L
Посмотрел раздел FAQ, нашел дерево с обходами(Но они сделаны через рекурсию). а мне нужен обход через стек,в частости Правый-Левый-Корень (гама-обход) обход.Если не трудно, то помогите, или дайте ссылку ,где можно посмотреть про обходы. [font=Arial]
Altair
http://pco.iis.nsk.su/ICP/Practice/dd8-3/node6.html
Цитата
Если использовать стек S для хранения текущего пути по дереву, т.е. пути, который начинается в корне дерева и кончается в вершине, посещаемой в данный момент, то можно предложить следующий нерекурсивный алгоритм префиксного обхода ордерева:
Dunkel_L
Вот написал бинарное дерево с гама-обходом(рекурсивный и обход через стек).Рекурсивный работает,а через стек нет((((.Помагите,в чем ошибка?
Код

Uses crt;

type ptr = ^node;
node = record
  info : char;
  llink, rlink : ptr;
end;

     pStack = ^tStack;
tStack =  record
  nd : ptr;
  next : pStack;
end;


procedure Push (var Stack: pStack; nd: ptr);
var StackEl: pStack;
begin
new (StackEl);
StackEl^.next:=Stack;
Stack:=StackEl;
StackEl^.nd:=nd;
end;

function Pop (Var Stack: pStack): ptr;
var StackEl: pStack;
begin
pop:=Stack^.nd;
StackEl:=Stack;
Stack:=StackEl^.next;
dispose (StackEl);
end;

procedure PrintTree( p : ptr;  h : integer );
begin
if p<>nil then begin
  PrintTree(p^.llink, h+1);
  gotoxy(wherex, h);
  textcolor(yellow);
  write(p^.info);
  textcolor(white);
  PrintTree(p^.rlink, h+1);
end;
end;

function CreateTree( n : integer; var i : integer) : ptr;
var newnode : ptr;
     nl, nr : integer;
     x : char;
begin
if n <= 0 then CreateTree := nil
else begin
  nl := n div 2;
  nr := n - nl - 1;
  i:=i+1;
  writeln;
  write ('Vvedite info uzla ',i,': ');
  readln(x);
  new(newnode);
  newnode^.info := x;
  newnode^.llink := CreateTree(nl, i);
  newnode^.rlink := CreateTree(nr, i);
  CreateTree := newnode;
end;
end;

procedure PLK(p : ptr);
begin
if p <> nil then begin
  plk(p^.Rlink);
  plk(p^.Llink);
  write(p^.info, ' ');
end;
end;

procedure plkstack(stack : ptr);
var root,p:ptr;
    flag : boolean;
    pr: boolean;

begin
p:=root;
{stack:=nil;}
flag := true;
while flag = true do begin
  while p <> nil do begin
   Push(p:false);
   p := p^.llink;
  end;
  p := Pop(pr);
  if pr=true then begin
  write(p^.info,' ');
  p:=nil;
  end
  else begin
   Push(p:true);
   p := p^.rlink;
  end;
  if stack=nil then begin flag:=false;
end;
end;

var root : ptr;
    n,i :integer;
begin
clrscr;
i:=0;

writeln('DEREVO');

write('Vvedite kolichestvo uzlov: ');
writeln;
readln(n);
root := CreateTree(n,i);
writeln('Psevdograficheskiy risunok: ');
PrintTree(root, n+5);
gotoxy(1, 2*n+3);
writeln('Gama-obhod (rekursiya): ');
PLK (root);
writeln;
writeln('Gama-obhod (stack): ');
plkstack(root);
readln;
end.
volvo
   Push(p:false);
Это чего такое? blink.gif
Гость
Цитата(volvo @ 9.03.2006 23:27) *

   Push(p:false);
Это чего такое? blink.gif

это р с признаком false помещается в стек
volvo
Цитата
р с признаком false помещается в стек
Я, конечно, извиняюсь, но в Паскале такое НЕ принято. В стек может помещаться то, что он сможет ХРАНИТЬ. А где в описаниях
type ptr = ^node;
node = record
  info : char;
  llink, rlink : ptr;
end;

pStack = ^tStack;
tStack =  record
  nd : ptr;
  next : pStack;
end;
мы видим хоть одно слово о True/False и вообще о типе Boolean?
CORS@R
Все что нужно можешь найти в этом файле
Гость
Цитата(CORS@R @ 10.03.2006 14:58) *

Все что нужно можешь найти в этом файле

Где здесь гама-обхот через стек? unsure.gif объясните,пожалуйста
-Dunkel_L-
Всё всем спасибо,разобрался.Теперь можно тему закрыть.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.