Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

Алгоритм построения идеально сбалансированного дерева

Идея алгоритма: Построим и выведем на экран бинарное дерево минимальной глубины из n узлов, вычислим его глубину. Значениями узлов будут целые числа, вводимые с клавиатуры. Для получения минимальной глубины при заданном числе узлов надо располагать максимально возможное число узлов на всех уровнях, кроме самого последнего. Это достигается распределением всех поступающих узлов поровну слева и справа от каждого узла. Реализует эту идею рекурсивный алгоритм:

  1. Взять один узел в качестве корня;

  2. Построить левое поддерево с количеством узлов nL = n div 2 тем же способом;

  3. Построить правое поддерево с количеством узлов nR = n-nL-1 тем же способом.

В программе этот алгоритм реализован рекурсивной функцией Tree.

program BinTree; {Построение идеально сбалансированного дерева, вывод его на экран, вычисление глубины дерева}

type ref = ^Node;

Node= record

Inf: integer;

Left,Right: ref

end;

var Root: ref; {Указатель на корень дерева}

H: integer; {Высота дерева}

n: integer; {Количество узлов}

function Tree(n: integer):ref; {Рекурсивная функция построения дерева из n узлов}

var t: ref; x,nL,nR: integer;

begin

If (n=0) then Tree:=nil

else begin

nL:=n div 2; {Половина узлов – в левом поддереве}

nR:=n-nL-1; {Половина узлов минус корень – в правом поддереве}

read(x);

new(t); {Выделение динамической памяти для узла}

t^.Inf:= x; {Итак, на рекурсивном спуске }

t^.Left :=Tree(nL); {Построение левого поддерева}

t^.Right:=Tree(nR); {Построение правого поддерева}

Tree:= t

end

end; { конец функции Tree }

procedure PrintTree (t: ref; h: integer); {Вывод дерева. Обход дерева справа налево.

t – указатель на поддерево; h – уровень узла поддерева, используется для отступа от левого края экрана}

const blank=' '; {пробелы для отступа каждого уровня}

var i : integer;

begin

if (t<>nil) then begin

PrintTree (t^.Right, h+1);

for i:=1 to h do write(blank); {Отступ на уровень h}

writeln(t^.Inf);

PrintTree (t^.Left, h+1) end

end;

function Height(t:ref):integer; {Определение высоты дерева. Обход дерева снизу вверх}

var hL, hR: integer;

begin

if (t=nil) then Height:= -1 {Если дерево пустое, функция выдает значение –1}

else begin

hL:=Height(t^.Left); {Определение высоты левого поддерева}

hR:=Height(t^.Right); {Определение высоты правого поддерева}

if (hL>hR) then Height:=hL + 1

else Height:=hR + 1

end

end; { конец функции Height}

begin {основная программа}

write('n='); readln(n);

Root:= Tree(n);

PrintTree(Root, 0); {Корень дерева печатается на уровне 0, без отступа от края экрана}

H:=Height(Root); writeln('Высота H=', H)

end.

Если ввести n=7 и значения узлов 1, 2, 3, 4, 5, 6, 7, то получим на экране изображение дерева:

7 5 6 1 4 2 3

Уровень узла:

h=2 h=1 h=2 h=0 h=2 h=1 h=2

Высота H=2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]