Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2010, 03:10   #1
LokTar
 
Регистрация: 19.05.2009
Сообщений: 3
По умолчанию Симетрический обход дерева

Итак задача состоит в том что дано дерево небходимо вывести его элементы в порядке симетричного обхода. Написал програму но ее крашит когда идет попытка перехода к правому сыну (выдается ошибка переполнения стека). Немогу понять где допущена ошибка, может ктото подскажет.

Код:
program derevo;
USES CRT;
const N=8;
type TDerevo=record
     Parent:integer;
     Uzel:integer;
     LeftChild:integer;
     RightChild:integer;
     TLabel:string;
end;

var
   i:integer;
   tree:array[0..8] of TDerevo;

procedure Obhod(i:integer; var tree:array of TDerevo);
var n,j:integer;
begin
     if tree[i].LeftChild<>0 then
           begin
          {writeln(tree[i].TLabel);}
           i:=tree[i].LeftChild;
           Obhod(i,tree);
           end
           else
           begin
     if (tree[i].LeftChild=0) and (tree[i].RightChild=0) and (tree[i].Parent<>0) then
         begin
         write('-',tree[i].Tlabel,'-');
         i:=tree[i].Parent;
         tree[i].LeftChild:=0;
         Obhod(i,tree);
         end
        else
      begin
      if (tree[i].LeftChild=0) and (tree[i].RightChild<>0) then
         begin
         write('-',tree[i].Tlabel,'-');
         i:=tree[i].RightChild;
         writeln(i);
        Obhod(i,tree);    
	

                end;
       end;
end;
end;
begin
clrscr;
 tree[1].Parent:=0;
 tree[1].Uzel:=0;
 tree[1].TLabel:='A';
 tree[1].LeftChild:=2;
 tree[1].RightChild:=3;
    tree[2].Parent:=1;
    tree[2].Uzel:=1;
    tree[2].TLabel:='B';
    tree[2].LeftChild:=0;
    tree[2].RightChild:=0;
       tree[4].Parent:=2;
       tree[4].Uzel:=2;
       tree[4].TLabel:='D';
       tree[4].LeftChild:=0;
       tree[4].RightChild:=0; 
    tree[3].Parent:=1;
    tree[3].Uzel:=3;
    tree[3].TLabel:='C';
    tree[3].LeftChild:=0;
    tree[3].RightChild:=0;
       tree[5].Parent:=3;
       tree[5].Uzel:=4;
       tree[5].TLabel:='E';
       tree[5].LeftChild:=0;
       tree[5].RightChild:=0;
       tree[6].Parent:=3;
       tree[6].Uzel:=5;
       tree[6].TLabel:='F';
       tree[6].LeftChild:=8;
       tree[6].RightChild:=0;
          tree[8].Parent:=6;
	        tree[8].Uzel:=6;
          tree[8].TLabel:='R';
          tree[8].LeftChild:=0;
          tree[8].RightChild:=0;
          tree[7].Parent:=6;
          tree[7].Uzel:=7;
          tree[7].TLabel:='G';
          tree[7].LeftChild:=0;
          tree[7].RightChild:=0;


Obhod(1,tree);

readkey;
end.

Последний раз редактировалось Stilet; 18.05.2010 в 12:13.
LokTar вне форума Ответить с цитированием
Старый 18.05.2010, 08:29   #2
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Поясни свою структуру хранения дерева.
У вершины 2 нет сыновей, но вершина 4 имеет родителя 2. Что это значит.

И для чего ссылки на родителя. Для симметричного обхода этого не нужно. Планируется расширение задачи ?
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 18.05.2010, 10:48   #3
LokTar
 
Регистрация: 19.05.2009
Сообщений: 3
По умолчанию

А это я просто тестировал и минял по разному дерево
Дерево имеет следущую структуру
Код:
tree[1].Parent:=0;
tree[1].Uzel:=0;
tree[1].TLabel:='A';
tree[1].LeftChild:=2;
tree[1].RightChild:=3;
tree[2].Parent:=1;
tree[2].Uzel:=1;
tree[2].TLabel:='B';
tree[2].LeftChild:=4;
tree[2].RightChild:=0;
tree[4].Parent:=2;
tree[4].Uzel:=2;
tree[4].TLabel:='D';
tree[4].LeftChild:=0;
tree[4].RightChild:=0; 
tree[3].Parent:=1;
tree[3].Uzel:=3;
tree[3].TLabel:='C';
tree[3].LeftChild:=5;
tree[3].RightChild:=6;
tree[5].Parent:=3;
tree[5].Uzel:=4;
tree[5].TLabel:='E';
tree[5].LeftChild:=0;
tree[5].RightChild:=0;
tree[6].Parent:=3;
tree[6].Uzel:=5;
tree[6].TLabel:='F';
tree[6].LeftChild:=8;
tree[6].RightChild:=7;
tree[8].Parent:=6;
tree[8].Uzel:=6;
tree[8].TLabel:='R';
tree[8].LeftChild:=0;
tree[8].RightChild:=0;
tree[7].Parent:=6;
tree[7].Uzel:=7;
tree[7].TLabel:='G';
tree[7].LeftChild:=0;
tree[7].RightChild:=0;

Последний раз редактировалось Stilet; 18.05.2010 в 12:14.
LokTar вне форума Ответить с цитированием
Старый 18.05.2010, 11:06   #4
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Очень уж ты намудрил с симметричным обходом. Вот так проще.
Код:
procedure Obhod1(i:integer; var tree:array of TDerevo);
var n,j:integer;
begin
if tree[i].LeftChild<>0 then
begin
Obhod1(tree[i].LeftChild,tree);
end;
writeln(Tree[i].TLabel,i);
if tree[i].RightChild<>0 then
begin
Obhod1(tree[i].RightChild,tree);
end;
end;
Основная проблема в твоем коде:
Код:
i:=tree[i].LeftChild;
Ты внутри функции переопределяешь i. А ниже ей пользуешься. По-логике, эта переменная внутри одного вызова функции должна быть постоянной. В моем коде эта ошибка поправлена.см.выше.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 18.05.2010, 11:49   #5
LokTar
 
Регистрация: 19.05.2009
Сообщений: 3
По умолчанию

Да сегодня утром после сна и сам увидил свою ошибку.
Но правильный вариан ты успел сделать быстрее =)
P.S. Z1000000 спасиба за внимание к моей проблеме и за ее решение.
LokTar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход бинарного дерева в ширину. Delphi 7. ZhooZhik Помощь студентам 4 01.12.2011 02:48
Обход дерева в глубину patriarch Общие вопросы C/C++ 1 07.05.2009 12:31
Обход двочного дерева + пару отн. простых задач С++ Lazio Фриланс 3 14.04.2009 14:56
обход дерева ribka Помощь студентам 2 11.12.2007 20:38