Алгоритм создания бинарного дерева (псевдокод)

 Для построения дерева необходимо создать в памяти ЭВМ элемент следующего типа:

P, Q - рабочие указатели

V=maketree(key,rec) - процедура, которая создает сегмент ключа и записи

P=getnode - генерация нового элемента

r=rec

k=key

V=P

left=nil

right=nil

tree - указатель на корень дерева

Введем сначала первое значение ключа, потом процедурой maketree сгенерируем сам элемент узла дерева. Далее идем по циклу до тех пор, пока указатель не передвинется на нулевое значение.

read (key, rec)

tree = maketree(key, rec)

while not eof do

  p = tree

  q = tree

  read (key, rec)

  v = maketree(key, rec)

  while p <> nil do

    q = p

    if key < k(p) then

                   p = left(p)

                              else

                   p = right(p)

    endif

  endwhile

if  p=nil then writeln (‘Это корень’)

tree=v   

else

  if key < k(q) then

                   left(q) = v

                            else

                   right(q) = v

  endif

         endif

endwhile

return

 

Если по этому алгоритму строить упорядоченное бинарное дерево, то при поступлении ключей в последовательности 14, 18, 6, 21, 1, 13, 15 получим дерево, изображенное на рисунке ниже.

Для того, чтобы просмотреть элементы созданного дерева, необходимо выполнить его обход.  

Алгоритм "обхода" дерева

Пусть задано бинарное дерево:

Существуют три вида обхода бинарных деревьев. Рассмотрим их на примере заданного дерева:

1) Обход сверху вниз (корень посещается ранее, чем поддеревья): A, B, C;

2) Слева направо: B, A, C;

3) Снизу вверх (корень посещается после поддеревьев): B, C, A.

Наиболее часто применяется 2-ой способ, узлы посещаются в порядке возрастания значения их ключа.

Рекурсивные процедуры обхода дерева:

1) PROCEDURE pretrave (tree)

         IF tree<>nil

           THEN PRINT info (tree)

                     tree=left (pretrave (tree))

                     tree=right (pretrave (tree))

         END IF

      RETURN

2) PROCEDURE intrave (tree)

         IF tree<>nil

           THEN tree=left (intrave (tree))

                    PRINT info (tree)

                     tree=right (intrave (tree))

         END IF

      RETURN

3) PROCEDURE postrave (tree)

         IF tree<>nil

           THEN tree=left (postrave (tree))

                     tree=right (postrave (tree))

                    PRINT info (tree)

         END IF

      RETURN