Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

284 Глава 7. Деревья

7.3 Двоичные деревья

Двоичное дерево - заказанное дерево, в котором у каждого узла есть самое большее два ребенка.

1. У каждого узла есть самое большее два ребенка. 2. Каждый детский узел маркирован как являющийся или покинутым ребенком или правильным ребенком. 3. Покинутый ребенок предшествует правильному ребенку в заказе детей узла.

Поддерево, внедренное в левом или правом ребенке внутреннего узла, называют узлом

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

Пример 7.8: важный класс двоичных деревьев возникает в контекстах, где мы желаем

представлять много различных результатов, которые могут следовать из ответа на серию yes-no вопросов. Каждый внутренний узел связан с вопросом. Начиная в корне, мы идем к левому или правому ребенку текущего узла, в зависимости от того, является ли ответ на вопрос «Да» или «Нет». С каждым решением мы следуем за краем от родителя ребенку, в конечном счете прослеживая путь в дереве от корня до внешнего узла. Такие двоичные деревья известны как деревья решений, потому что каждый внешний узел p в таком дереве представляет решение о том, что сделать, если на вопросы, связанные с предками p, отвечают в пути, который приводит к p. Дерево решений - надлежащее двоичное дерево. Рисунок 7.10 иллюстрирует дерево решений, которое предоставляет рекомендации возможному инвестору.

Рисунок 7.10: дерево решений, обеспечивающее консультации по инвестициям.

7.3. Двоичные деревья 285

Пример 7.9: арифметическое выражение может быть представлено деревом чей exter -

узлы nal связаны с переменными или константами, и чьи внутренние узлы

связанный с одним из операторов +,- , и/. (См. рисунок 7.11.) Каждый узел

в таком дереве связали стоимость с ним.

• Если узел внешний, то его стоимость - стоимость его переменных или постоянных.

• Если узел внутренний, то его стоимость определена, применив его действие к

ценности его детей.

Такое дерево арифметического выражения - надлежащее двоичное дерево, так как каждый из oper-ators +,- , и / берет точно два операнда. Конечно, если мы должны были допускать одноместных операторов, как отрицание (-), как в «-x», тогда у нас могло быть неподходящее

двоичное дерево.

Рисунок 7.11: двоичное дерево, представляющее арифметическое выражение. Это дерево repre-

центы выражение ((((3 + 1) 3) / ((9- 5) + 2))- ((3 (7- 4)) + 6)). Стоимость

связанный с внутренним узлом, маркированным «/», 2.

Рекурсивное определение двоичного дерева

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

дерево или пусто или состоит из:

• Узел r, названный корнем T и хранения элемента

• Двоичное дерево, названное левым поддеревом T • Двоичное дерево, названное правильным поддеревом T

Мы обсуждаем некоторые специализированные темы для двоичных деревьев ниже.

7.3.1 Двоичное дерево ADT

В этой секции мы вводим абстрактный тип данных для двоичного дерева. Как с нашим

более раннее дерево ADT, каждый узел дерева хранит элемент и связан с a

286

Глава 7. Объект положения деревьев, который обеспечивает открытый доступ узлам. Перегружая deref-erencing оператор, к элементу, связанному с положением p, можно получить доступ *p. Кроме того, положение p поддерживает следующие операции.

p.left (): Возвратите покинутого ребенка p; состояние ошибки происходит если p

внешний узел.

p.right (): Возвратите правильного ребенка p; состояние ошибки происходит если p

внешний узел. p.parent (): Возвратите родителя p; ошибка происходит, если p - корень. p.isRoot (): Возвратитесь верный, если p - корень и ложный иначе.

p.isExternal (): Возвратитесь верный, если p внешний и ложный иначе.

Само дерево обеспечивает те же самые операции как стандартное дерево ADT. Вспомнить

то, что список положения - список положений дерева.

размер (): Возвратите число узлов в дереве.

пустой (): Возвратитесь верный, если дерево пустое и ложное иначе.

корень (): Возвратите положение для корня дерева; ошибка происходит если

дерево пусто.

положения (): Возвратите список положения всех узлов дерева. Как в Разделе 7.1.2 для дерева ADT, мы не определяем специализированные функции обновления для двоичных деревьев, но мы рассматриваем их позже.

7.3.2 C ++ интерфейс двоичного дерева

Давайте представим неофициальный интерфейс C ++ для двоичного дерева ADT. Мы начинаем в

Кодовый Фрагмент 7.15, представляя неофициальный интерфейс C ++ для класса Posi-tion, который представляет положение в дереве. Это отличается от интерфейса дерева Секунды - tion 7.1.3, заменяя членских детей функции дерева двумя левыми и правыми функциями.

шаблон <typename E> //базируют тип элемента

Положение <E> класса  //положение узла

общественность:

E& оператор* ();

//

g et el ement

Положение оставило () константу;

//

получите покинутого ребенка

Право положения () константа;

//

получите правильного ребенка

Родитель положения () константа;

//

получите родителя

bool isRoot () константа;

//

корень дерева?

bool isExternal () константа;

//

внешний узел?

;

Кодовый Фрагмент 7.15: неофициальный интерфейс для двоичного дерева ADT (не полное

C ++ класс).