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

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Бинарное дерево, Нужна помощь
Dunkel_L
сообщение 7.03.2006 6:55
Сообщение #1


Новичок
*

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

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


Посмотрел раздел FAQ, нашел дерево с обходами(Но они сделаны через рекурсию). а мне нужен обход через стек,в частости Правый-Левый-Корень (гама-обход) обход.Если не трудно, то помогите, или дайте ссылку ,где можно посмотреть про обходы. [font=Arial]
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 7.03.2006 9:38
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


http://pco.iis.nsk.su/ICP/Practice/dd8-3/node6.html
Цитата
Если использовать стек S для хранения текущего пути по дереву, т.е. пути, который начинается в корне дерева и кончается в вершине, посещаемой в данный момент, то можно предложить следующий нерекурсивный алгоритм префиксного обхода ордерева:


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Dunkel_L
сообщение 9.03.2006 23:11
Сообщение #3


Новичок
*

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

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


Вот написал бинарное дерево с гама-обходом(рекурсивный и обход через стек).Рекурсивный работает,а через стек нет((((.Помагите,в чем ошибка?
Код

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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.03.2006 23:27
Сообщение #4


Гость






   Push(p:false);
Это чего такое? blink.gif
 К началу страницы 
+ Ответить 
Гость
сообщение 10.03.2006 0:58
Сообщение #5


Гость






Цитата(volvo @ 9.03.2006 23:27) *

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

это р с признаком false помещается в стек
 К началу страницы 
+ Ответить 
volvo
сообщение 10.03.2006 1:30
Сообщение #6


Гость






Цитата
р с признаком 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
сообщение 10.03.2006 14:58
Сообщение #7


Новичок
*

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

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


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


Прикрепленные файлы
Прикрепленный файл  T6_1.PAS ( 4.99 килобайт ) Кол-во скачиваний: 248
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 14.03.2006 17:21
Сообщение #8


Гость






Цитата(CORS@R @ 10.03.2006 14:58) *

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

Где здесь гама-обхот через стек? unsure.gif объясните,пожалуйста
 К началу страницы 
+ Ответить 
-Dunkel_L-
сообщение 19.03.2006 23:02
Сообщение #9


Гость






Всё всем спасибо,разобрался.Теперь можно тему закрыть.
 К началу страницы 
+ Ответить 

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

 



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