Алгоритмы прошивки и обхода прошитых деревьев

Рассмотрим алгоритм правосторонней симметричной прошивки бинарного дерева.

1. Строится бинарное дерево. При этом поля ltag и rtag создаваемых узлов дерева остаются неопределенными, а left и right соответственно указывают на левое или правое поддеревья, либо равны nil. На корень построенного дерева указывает root.

2. Создается головной узел, left которого указывает на корень дерева, а right на сам головной узел:

new(HEAD); HEAD^.left:= root; HEAD^.right:= HEAD; Информационное поле и поля тэгов головного узла можно оставить неопределенными.

3. Прошивка правых связей. Вводится дополнительный глобальный указатель y (указатель на узел, предшествующий текущему узлу). Указатель на текущий узел p устанавливаем на корень дерева (p:= HEAD^.llink).

Выполняется симметричный обход дерева. При обработке каждого узла проверяется: если p^.right <>nil, то p^.rtag:=true; иначе p^.rtag:=false; y:=p; (указатель на предшественника). В любом случае выполняем.

Программный код процедур симметричного обхода sim_print и прошивки правых связей rightsew будет выглядеть так:

procedure sim_print(var x:pt);

procedure rightsew(var p:pt);

begin

if y <> nil then

begin

if y^.right=nil then

begin

y^.rtag:= false;

y^.right:= p;

end

else y^.rtag:= true;

end;

y:=p;

end;

begin

if x<> nil then

begin

sim_print(x^.left);

rightsew(x);

sim_print(x^.right);

end;

end;

Рассмотрим алгоритм обхода прошитого бинарного дерева. Пусть HEAD – указатель на головной узел прошитого дерева, p – указатель на текущий узел. Тогда алгоритм симметричного обхода прошитого дерева можно сформулировать следующим образом:

1. Переход к корню дерева (p:= HEAD^.left).

2. До тех пор, пока p^.left<>nil, повторять: p:= p^.left, то есть идти по левой ветви до самого левого узла.

3. Обработка узла p, например, печать p^.info.

4. Если p^.rtag равен false, то p:= p^.right и переход к шагу 3 (к преемнику). Иначе p:= p^.right и переход к шагу 2.

Алгоритм заканчивает работу, когда p станет равным HEAD.

Лабораторная работа №6

Цель работы: научиться прошивать различными способами, а затем обходить бинарные деревья, а также выполнять на них операции с данными.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: