![]() |
|||||
![]() |
![]() |
a1 a2 a3
a
![]() |
A B
![]() |
|||
![]() |
|||
1 2
3 4 5
![]() |
|||
![]() |
|||
a1 a2 a3
a
![]() |
A
![]() |
![]() |
1 B
![]() |
|||
![]() |
|||
2 3
![]() |
|||||
![]() |
|||||
![]() |
|||||
a1 a2 4
![]() |
![]() |
||
a3 5
Этап 1.
Структура преобразуется к дереву, содержащему только горизонтальные и вертикальные ребра. При этом:
- для каждой вершины все исходящие из нее ребра, кроме самого левого, заменяются на горизонтальные связи с соседней левой вершиной;
- вводятся горизонтальные ребра, каждое из которых соединяет некоторую вершину с вершиной расположенной справа от нее и имевшей с ней единого родителя.
Этап 2.
Для каждой вершины дерева осуществляется выбор ее левого и правого сына по следующему правилу:
- левым сыном является нижележащая вершина,
- правым сыном является вершина расположенная непосредственно справа от данной на одном уровне с ней.
В качестве упражнения можно описать содержательный алгоритм восстановления исходного дерева по бинарному.
Хранение бинарного дерева в машинной памяти необходимо обеспечить с минимальной избыточностью. Ниже рассматриваются три варианта, в определенной степени отвечающие этому требованию:
- связанная нелинейная структура,
- хранение дерева в области свободных узлов,
- хранение бинарного дерева в массиве с прямой адресацией вершин.
-
Вариант 1.
Каждая вершина позиционного бинарного дерева представляется записью, включающей три части:
- ссылка на левого сына вершины (ll),
- информационная часть (info),
- ссылка на правого сына (rl).
Пример структуры хранения для бинарного дерева с префиксным кодом {(01),(100),(101)} представлен на рис.10.7.
ROOT
![]() |
![]() |
ll info rl
![]() |
![]() |
||||||||||
![]() |
|||||||||||
![]() |
![]() |
![]() |
|||||||||
NULL info rl ll info NULL
![]() |
|||||||||||
![]() |
|||||||||||
![]() |
![]() |
![]() |
![]() |
||||||||
NULL info NULL rl info ll
![]() |
|||||||||||
![]() |
|||||||||||
![]() |
![]() |
![]() |
![]() |
||||||||
ll info rl ll info rl
Вариант 2.
При использовании области свободных узлов для хранения бинарного дерева резервируется массив записей со структурой записи аналогичной выше. Отличие заключается в типе полей ll и rl, которые в этом случае должны быть целыми числами. Принцип использования области свободных узлов для хранения бинарного дерева аналогичен описанному выше методу для связанных списков. Рисунок 10.8 иллюстрирует представление дерева с использованием этого варианта структуры хранения.
|
R1 |
ll |
info |
rl |
|||
R1=2 |
5 |
Y |
7 |
||||
X |
1 |
X |
4 |
||||
|
~ |
~ |
6 |
||||
Y |
Z |
0 |
Z |
0 |
|||
|
0 |
Y1 |
0 |
||||
Y1 |
Y2 |
||||||
0 |
Y2 |
0 |
Вариант 3.
Полным бинарным деревом с n уровнями называется дерево, в котором каждый узел уровня n-1 является листом, а каждый узел других уровней имеет непустые левые и правые поддеревья. Узлы такого бинарного дерева могут быть занумерованы так, чтобы номер, назначенный левому сыну, был равен удвоенному номеру, присвоенному его отцу, а номер присваиваемый его брату, на единицу больше. В этом случае нам не требуется связей между различными вершинами в форме указателей. Каждый узел с назначенным ему номером m является отцом сыновей с номерами 2m и 2m+1. Дерево с n уровнями в этом случае логично представить массивом записей info размером 2^n-1 элементов. Можно построить функцию адресации, отображающую префиксный код вершины на множество индексов от 1 до 2^n-1.
Можно распространить такое представление на любые бинарные деревья путем расширения последних до полного бинарного дерева со специальными отметками для вершин, не входящих в исходное дерево. Пример представления дерева с использованием этой структуры хранения представлен на рис.10.9.
info |
P |
||||||||
корень |
1 |
Корень |
1 |
||||||
|
2 |
A1 |
1 |
||||||
A1 |
B1 |
3 |
B1 |
1 |
|||||
|
4 |
A2 |
1 |
||||||
A2 |
B2 |
5 |
0 |
||||||
6 |
0 |
||||||||
7 |
B2 |
1 |
Рисунок 10.9
Очевидно, что с точки зрения рационального использования памяти этот вариант тем эффективней, чем ближе исходное дерево к полному.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.