Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания к лабораторным.doc
Скачиваний:
43
Добавлен:
20.06.2014
Размер:
462.85 Кб
Скачать

1.2. Реализация деревьев

Представление деревьев с помощью массивов

Пусть T – дерево с n узлами: 0, 1, ...n-1. Наиболее простым представлением дерева Т является линейный массив А, где каждый элемент А[i] соответствует родителю узла i. Положим, что корню дерева соответствует значение -1. Тогда А[i] = j, если узел j – родитель узла i, и A[i] = -1, если i является корнем (см. рис. 2).

Рис. 2. Реализация дерева в виде массива: а – исходное дерево, б – массив, в котором индексы соответствуют узлам дерева, а элементы – родителям узлов

Данное представление использует то свойство деревьев, что каждый узел, отличный от корня, имеет только одного родителя. При таком представлении родителя любого узла можно найти за фиксированное время. Прохождение по любому пути выполняется за время, пропорциональное количеству узлов пути. Если в узлах необходимо хранить ключи, можно использовать другой массив L того же размера, в котором элемент L[i] будет хранить ключ узла i, или объявить элементы массива А структурами, состоящими из целых чисел (номеров узлов) и ключей.

Для двоичных деревьев можно использовать иную, более эффективную реализацию в виде массива. Это представление использует один линейный массив A. Значение из корня дерева помещается в нулевой элемент массива, значения из двух дочерних вершин – в соседние элементы и т.д. Если значение из узла N занимает элемент массива A[K], то значение, соответствующее левому дочернему узла этого узла, записано в A[2K], а значение, соответствующее правому дочернему узлу – в A[2K+1]. При таком представлении в массиве могут появиться неиспользуемые значения, которые необходимо каким-либо образом помечать как пустые. Подобная реализация обеспечивает эффективное хранение сбалансированных деревьев, но мало используется ввиду ограничения на размер массива.

Представление деревьев с использованием списков дочерних узлов

Важным способом реализации дерева является формирование списка дочерних узлов для каждого его узла. Списки можно представлять любым из соответствующих методов, но так как у узлов часто бывает переменное число дочерних узлов, часто используются связные списки.

0

1

2

3

4

5

6

7

8

9

Рис. 3. Представление дерева в виде списков дочерних узлов

На рис. 3 в виде совокупности связных списков представлено дерево, показанное на рис. 2. Здесь используется массив указателей-заголовков, индексированных номерами узлов. Любой заголовок узла i указывает на связный список элементов, являющихся дочерними узлами данного узла, расположенных в порядке слева направо. Аналогичное дерево можно построить без использования указателей, с помощью двух массивов структур. В одном из них хранятся ключи с соответствующими заголовками, имеющими произвольное местоположение. В другом – цепочки дочерних узлов для каждого заголовка ( рис. 4). Например, узел E дерева, изображенного на рис. 4, имеет три дочерних узла (G, H, I) с индексами в первой таблице 1, 3, 9 соответственно. Заголовок, соответствующий ключу E, из первой таблицы содержит индекс 8 второй таблицы. В первом поле структуры с этим номером хранится индекс 1 ключа G, второе поле содержит индекс (в той же таблице), соответствующий структуре, содержащей индекс следующего ключа (дочернего узла) из первой таблицы и т.д.

0

5

1

G

1

6

2

А

5

2

3

4

3

H

4

D

B

7

4

9

5

C

1

5

4

0

6

F

6

8

7

D

7

7

6

8

E

8

8

1

2

9

I

Рис. 4. Представление дерева в виде списка дочерних узлов, не использующее указатели: а – исходное дерево, б – массивы для его хранения

Можно упростить структуру дерева, если все элементы хранить в одном массиве (списке) структур. Каждая из них будет содержать ключ, индекс (ссылку на) самый левый дочерний узел, индекс (ссылку на) узел непосредственно правого соседа (рис. 5).

1

G

3

2

4

A

3

H

9

4

7

B

5

5

6

C

6

F

7

D

8

8

1

E

9

I

Рис. 5. Представление дерева в виде списка дочерних узлов с использованием одного массива структур

Представление деревьев с помощью указателей

Классический способ представления деревьев предполагает наличие совокупности структур, каждая из которых в простом случае содержит ключ и указатели на аналогичные структуры, количество которых равно степени дерева:

struct Tree {

Tree *leftmost_child;

Tree *right_sibling_1;

Tree *right_sibling_2;

...

Tree *right_sibling_k; //для дерева степени k+1

};