
- •Бинарные деревья. Прохождение их в прямом, обратном и симметричном направлении Бинарные деревья
- •11.1. Структура бинарного дерева
- •Проектирование класса ТгееNode
- •Построение бинарного дерева
- •11.2. Разработка функций класса TreeNode
- •2.Введение.
- •3. Текст исходной программы.
- •4.Результаты контрольного примера.
11.1. Структура бинарного дерева
Структура бинарного дерева построена из узлов. Как и в связанном списке, эти узлы содержат поля данных и указатели на другие узлы в коллекции. В этом разделе определяются узлы дерева и операции для его построения и прохождения. Подобно представлению класса Nodeв гл.9 объявляется класс ТгееNode, а затем разрабатывается ряд функций, использующих узлы дерева для построения бинарного дерева в прохождения индивидуальных узлов.
Узел дерева содержит поле данных и два поля с указателями. Поля указателей называются левым указателем (left) и правым указателем (right), поскольку они указывают на левое и правое поддерево, соответственно. Значение NULL является признаком пустого дерева.
Корневой узел определяет входную точку дерева, а поле указателя – узел следующего уровня. Листовой узел содержит NULL в поле правого и левого указателей (рис. 11.8).
Проектирование класса ТгееNode
В этом разделе разрабатывается класс ТгееNode, в котором объявляются объекты-узлы бинарного дерева. Узел состоит из поля данных, которое является открытым (public)элементом, т.е. к которому пользователь может обращаться непосредственно. Это позволяет клиенту читать или обновлять данные во время прохождения дерева, а также допускает возвращение ссылки на данные. Последняя особенность используется более сложными структурами данных, такими как словари. Два поля с указателями являются закрытыми (private) элементами, доступ к которым осуществляется посредством функций Left(),Right().Объявление и определение класса TreeNode содержатся в файле treenode.h.
ОБЪЯВЛЕНИЕ
// 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 возвращают значения полей левого и правого указателей. Благодаря этому клиент имеет доступ к левому и правому сыновьям узла.