Составители:
Рубрика:
ритм для всех трех порядков обхода использует стек S для хранения упорядо-
ченных пар ( p , n ), где p − узел бинарного дерева, а n - номер операции, кото-
рую надо применить к p, когда пара ( p , n ) будет выбрана из стека. Операции
“посетить корень”, “пройти левое поддерево”, “пройти правое поддерево” ну-
меруются числами 1,2,3 в зависимости от порядка их выполнения в данном
варианте обхода. В алгоритме эти операции будут реализованы следующим
образом:
посетить корень – посетить ( p );
пройти левое поддерево -
if not Null ( Left ( p ) ) then S
←
( Left ( p ) , 1 );
пройти правое поддерево -
if not Null ( Right ( p ) ) then S
←
( Right ( p ) , 1 ).
Здесь и далее для краткости и наглядности использованы следующие обозна-
чения операций со стеком: S ← e вместо S := Push ( e , S ) и e ← S вместо Pop2
( e , S ).
Тогда общий алгоритм имеет вид:
procedure обход ( b: BTree );
var S: Stack of ( BTree , operation ) ;
p: BTree; op: operation { =1..3};
begin
S:= Create; S ← ( b , 1);
while not Null ( S ) do
begin ( p , op ) ← S;
if op = 1 then begin S ← ( p , 2); операция 1 end
else if op = 2 then begin S ← ( p , 3); операция 2 end
else { op = 3 } операция 3
end{while}
end{обход}
В случае КЛП-обхода можно существенно упростить алгоритм, исключая
лишние для этого варианта манипуляции со стеком. Здесь нет необходимости
хранить в стеке номер операции. Итак, конкретизация (с упрощением) общего
алгоритма для КЛП-обхода имеет вид:
procedure обход_КЛП ( b: BTree ); {прямой}
var S: Stack of BTree; p: BTree;
begin
S:= Create; S ← b;
while not Null ( S ) do
begin
p ← S;
посетить ( p );
if not Null ( Right ( p ) ) then S
←
Right ( p );
if not Null ( Left ( p ) ) then S
←
Left ( p )
end{while}
end{обход_КЛП}
52
ритм для всех трех порядков обхода использует стек S для хранения упорядо-
ченных пар ( p , n ), где p − узел бинарного дерева, а n - номер операции, кото-
рую надо применить к p, когда пара ( p , n ) будет выбрана из стека. Операции
“посетить корень”, “пройти левое поддерево”, “пройти правое поддерево” ну-
меруются числами 1,2,3 в зависимости от порядка их выполнения в данном
варианте обхода. В алгоритме эти операции будут реализованы следующим
образом:
посетить корень – посетить ( p );
пройти левое поддерево -
if not Null ( Left ( p ) ) then S ← ( Left ( p ) , 1 );
пройти правое поддерево -
if not Null ( Right ( p ) ) then S ← ( Right ( p ) , 1 ).
Здесь и далее для краткости и наглядности использованы следующие обозна-
чения операций со стеком: S ← e вместо S := Push ( e , S ) и e ← S вместо Pop2
( e , S ).
Тогда общий алгоритм имеет вид:
procedure обход ( b: BTree );
var S: Stack of ( BTree , operation ) ;
p: BTree; op: operation { =1..3};
begin
S:= Create; S ← ( b , 1);
while not Null ( S ) do
begin ( p , op ) ← S;
if op = 1 then begin S ← ( p , 2); операция 1 end
else if op = 2 then begin S ← ( p , 3); операция 2 end
else { op = 3 } операция 3
end{while}
end{обход}
В случае КЛП-обхода можно существенно упростить алгоритм, исключая
лишние для этого варианта манипуляции со стеком. Здесь нет необходимости
хранить в стеке номер операции. Итак, конкретизация (с упрощением) общего
алгоритма для КЛП-обхода имеет вид:
procedure обход_КЛП ( b: BTree ); {прямой}
var S: Stack of BTree; p: BTree;
begin
S:= Create; S ← b;
while not Null ( S ) do
begin
p ← S;
посетить ( p );
if not Null ( Right ( p ) ) then S ← Right ( p );
if not Null ( Left ( p ) ) then S ← Left ( p )
end{while}
end{обход_КЛП}
52
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »
