logo search
УП_САОД_2003

Обходы деревьев

Существует несколько способов обхода (просмотра) всех вершин дерева. Три наиболее часто используемых способа обхода называются:

Все три способа обхода рекурсивно можно определить следующим образом:

  1. если дерево Tree является пустым деревом, то в список обхода заносится пустая запись;

  2. если дерево Tree состоит из одной вершины, то в список обхода записывается эта вершина;

  3. если Tree – дерево с корнем n и поддеревьями Tree1, Tree2, … Treek, то:

Рисунок 15. Обходы деревьев

Далее приведены наброски процедур, реализующих указанные способы обходов деревьев. При доработке этих набросков необходимо учитывать конкретную реализацию деревьев.

procedure PreOrder(n: вершина);

{Обход дерева в прямом порядке}

begin

Занести в список обхода вершину n;

for для каждого потомка s вершины n в порядке слева направо do

PreOrder(s);

end;

procedure LastOrder(n: вершина);

{Обход дерева в обратном порядке}

begin

for для каждого потомка s вершины n в порядке слева направо do

LastOrder(s);

Занести в список обхода вершину n;

end;

procedure InOrder(n: вершина);

{Обход дерева в симметричном порядке}

begin

if n – лист then begin

занести в список обхода узел n;

end else begin

InOrder(самый левый потомок вершины n);

Занести в список обхода вершину n;

for для каждого потомка s вершины n, исключая самый левый,

в порядке слева направо do

InOrder(s);

end;

end;