Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Pascal] Дерево без рекурсии. Как?

13K
27 апреля 2008 года
*alt
36 / / 12.04.2007
Помогите переписать без рекурсии function equal или procedure print_tree...
Код:
{Описать логическую функцию, проверяющую на равенство два заданных двоичных дерева}

program num4;

Type
  Tinf = integer;
  Ttree = ^TNode;
  TNode = Record
     info: Tinf;
     left, right: Ttree;
   End;

Var
  s, s1: tinf;
  root, root1: Ttree;
  i,n, h1,h: integer;

{создание дерева}
procedure add_node (var root:TTree; el: Tinf);
var elem: TTree;
begin
    if (root=NIL) then (* Если дерево пустое, то *)
        begin
            new(elem); (* Создать новый лист *)
            elem^.left:=NIL;
            elem^.right:=NIL;
            elem^.info:=el; (* Записать туда значение требуемого элемента *)
            root:=elem; (* Присоединить новый лист вместо пустого дерева *)
        end
    else  (* Иначе *)
        begin
            if (el<root^.info) then  (* Если добавляемое значение меньше текущего узла, то *)
                add_node (root^.left, el) (* Добавить его в левое поддерево *)
            else (* Иначе *)
                add_node (root^.right, el); (* Добавить его в правое поддерево *)
        end;
end;


{проверка на равенство деревьев}
function equal(p1, p2 : Ttree) : boolean;
  begin
    if (p1=nil) and (p2=nil) then equal := true
    else
      if (p1<>nil) and (p2<>nil)
        then equal := (p1^.info= p2^.info) and equal(p1^.left, p2^.left)
                                 and equal(p1^.right, p2^.right)
      else equal := false
end;

(* Печать дерева *)
procedure print_tree (root: Ttree; h: integer);
const
  n=40;
var i: integer;
begin
    if root<>nil then
    with root^ do
    begin
        print_tree (Left, h+2);
        for i:=1 to n-h do
           write(' ');
           writeln (info);
        print_tree (Right, h+2);

    end;
end;

begin{main}

  {ввод}
  write ('Введите количество элементов в 1-ом дереве: ');
  read (i);
  n:=0;
  repeat
    write ('Введите элемент 1-го дерева: ');
    readln (s);
    add_node(Root, s);
    n:=n+1;
    until n=i;

  write ('Введите количество элементов во 2-ом дереве: ');
  read (i);
  n:=0;
  repeat
    write ('Введите элемент 2-го дерева: ');
    readln (s1);
    add_node (Root1, s1);
    n:=n+1;
    until n=i;

  {Сравнение}
  if equal(root, root1)=true then
    writeln('Деревья Равны')
  else  writeln('Деревья НЕ Равны');
  readln;

  {Печать}
  writeln('Первое Дерево');
  h:=0; h1:=0;
  print_tree (root, h);
   writeln('Второе Дерево');
  print_tree (root1, h1);
  readln;
End.
360
27 апреля 2008 года
P*t*
474 / / 15.02.2007
используй стандартный обход в ширину:
1)создаёшь очередь
2)на каждом шаге удаляешь из неё первую вершину и добавляешь всех её потомков.

таким образом обходятся все вершины, что тебе и нужно.
13K
07 мая 2008 года
*alt
36 / / 12.04.2007
P*t*, а можно поконкретнее, пожалуйста???
360
07 мая 2008 года
P*t*
474 / / 15.02.2007
Отобразить содержимое дерева - значит отобразить содержимое вершин.
Значит нужно каким-то образом обойти все его вершины, не используя рекурсию.
Первое, что приходит в голову - стандартный обход в ширину.
Ещё можно моделировать рекурсию, используя стек.

Если нужно более подробно, то смотри сюда:
http://www.google.com/search?q=cache:Q0c4lkZEPfYJ:service.sch239.spb.ru:8001/infoteka/root/inform/room4/11-y%2520klass%2520(3%2520ili%25204%2520god%2520obucheniya)/Tema%25205.%2520Dinamicheskie%2520struktury/5.06%2520Urok%2520Obhod%2520dereva%2520v%2520shirinu.doc%3FPHPSESSID%3Dbd4bd59e98682f0adcfb8021096fdea9+%D0%BE%D0%B1%D1%85%D0%BE%D0%B4+%D0%B2+%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&hl=ru&ct=clnk&cd=3&gl=ru&client=firefox-a
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог