456 Часть III. Современное программирование на C++

/ I Выталкивание одного наружу. STUDENT si(students.Pop());

cout « "Студент " « sl.GetIdO « "изъят из стека." « endl;

const STUDENT s2(students.Top());

cout « "Студент " « s2.GetId() « "остался на вершине стека."« endl;

Бинарное дерево

Бинарные деревья (binary trees) состоят из узлов (nodes), которые содержат собственно данные и два указателя на потомков — левого и правого. Узел, не имеющий потомков, называется конечным узлом (terminal node). Начальный узел называется корневым (root node). Добавление элемента в двоичное дерево происходит следующим образом. Новый элемент сравнивается с корневым узлом при помощи операции <. Если он меньше корневого, он сравнивается с левым узлом, а затем (если он меньше) с его потомком; в противном случае, если элемент больше корневого узла, он сравнивается с правым узлом. Процесс повторяется до тех пор, пока не окажется, что потомков больше нет. Тогда добавляется новый узел со значением, равным этому элементу.

Достоинство бинарных деревьев заключается в эффективном доступе к данным, содержащимся в дереве. Эта эффективность зависит от того, насколько дерево является сбалансированным. Крайним примером несбалансированного дерева является размещение в таком дереве упорядоченного списка. В этом случае каждый узел будет иметь только одного потомка — левого, если список был отсортирован по возрастанию и только правого, если по убыванию. Результатом будет однонаправленный список. Хорошо сбалансированное дерево имеет одинаковое число левых и правых потомков. Поиск в бинарном дереве и добавление новых элементов наиболее эффективны в случае хорошо сбалансированных деревьев.

Класс STUDENT, определенный в листинге 18.5 (student2.h), имеет хорошо определенные операции сравнения и равенства, поэтому объекты этого класса можно использовать в бинарном дереве:

typedef TBinarySearchTreeImp<STODENT> STUDENT_TREE;

typedef TIBinarySearchTreeImp<STUDENT> STUDENT_POINTER_TREE;

Оба конструктора не имеют аргументов. Функции-члены Add, Detach, Find,

Flush, ForEach, GetItemsInContainer И IsEmpty аналогичны ТВКИМ же функЦИ-

ям для контейнеров-массивов.

Листинг 18.14 демонстрирует использование косвенного контейнера типа бинарное дерево.

h04561.jpg

^include <iostream.h> ttinclude <iomanip.h>