Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бинарные деревья. Прохождение их различными спо....doc
Скачиваний:
3
Добавлен:
05.11.2018
Размер:
796.16 Кб
Скачать

11.1. Структура бинарного дерева

Структура бинарного дерева построена из узлов. Как и в связанном списке, эти узлы содержат поля данных и указатели на другие узлы в коллекции. В этом разделе определяются узлы дерева и операции для его построения и прохождения. Подобно представлению класса Nodeв гл.9 объявляется класс ТгееNode, а затем разрабатывается ряд функций, использующих узлы дерева для построения бинарного дерева в прохождения индивидуальных узлов.

Узел дерева содержит поле данных и два поля с указателями. Поля указателей называются левым указателем (left) и правым указателем (right), поскольку они указывают на левое и правое поддерево, соответственно. Значение NULL является признаком пустого дерева.

Корневой узел определяет входную точку дерева, а поле указателя – узел следующего уровня. Листовой узел содержит NULL в поле правого и левого указателей (рис. 11.8).

Проектирование класса ТгееNode

В этом разделе разрабатывается класс ТгееNode, в котором объявляются объекты-узлы бинарного дерева. Узел состоит из поля данных, которое является открытым (public)элементом, т.е. к которому пользователь может обращаться непосредственно. Это позволяет клиенту читать или обновлять данные во время прохождения дерева, а также допускает возвращение ссылки на данные. Последняя особенность используется более сложными структурами данных, такими как словари. Два поля с указателями являются закрытыми (private) элементами, доступ к которым осуществляется посредством функций Left(),Right().Объявление и определение класса TreeNode содержатся в файле treenode.h.

Спецификация класса TreeNode

ОБЪЯВЛЕНИЕ

// BinSTree зависит от TreeNode template <class T> class BinSTree;

// объявление объекта для узла бинарного дерева template <class T> class TreeNode { private:

// указатели левого и правого дочерних узлов

TreeNode<T> *left;

TreeNode<T> «right;

public:

// открытый элемент, допускающий обновление Т data;

// конструктор

TreeNode (const Ts item, TreeNode<T> *lptr - NULL, TreeNode<T> «rptr = NULL);

// методы доступа к полям указателей TreeNode<T>* Left(void) const; TreeNode<T>* Right(void) const;

// сделать класс BinSTree дружественным, поскольку необходим // доступ к полям left и right | friend class BinSTree<T>;

); '

ОПИСАНИЕ

Конструктор инициализирует поля данных и указателей. С помощью пустого указателя NULL узлы инициализируются как листья. Имея указатель р объекта TreeNode в качестве параметра, конструктор присоединяет Р как левого или правого сына нового узла.

Методы доступа Left и Right возвращают соответствующий указатель. Класс BinSTree объявляется дружественным классу TreeNode и может модифицировать указатели. Другие клиенты должны использовать конструктор для создания указателей и методы Left и Right для прохождения дерева.

ПРИМЕР

// указатели целочисленных узлов дерева TreeNode<int> «root, *lchild, «rchild; TreeNode<int> *p;

// создать листья, содержащие 20 и 30 в качестве данных

Ichild = new TreeNode<int> (20);

rchild = new TreeNode<int> (30);

// создать корень, содержащий число 10 и двух сынове root - new TreeNode<int> (10, Ichild, rchild);

root->data = 50; // присвоить корню 50

Реализация класса TreeNode Класс TreeNode инициализирует поля объекта. Для инициализации поля данных конструктор имеет параметр item. Указатели назначают узлу левого и правого сына (поддерево). При отсутствии сына используется значение NULL.

// конструктор инициализирует поля данных и указателей // значение NULL соответствует пустому поддереву template <class T> TreeNode<T>::TreeNode(const T& item, TreeNode<T> *lptr,

TreeNode<T> *rptr):data(item), left(lptr), right(rptr)

Методы Left и Right возвращают значения полей левого и правого указателей. Благодаря этому клиент имеет доступ к левому и правому сыновьям узла.