Почти все учебники и веб-сайты по деревьям двоичного поиска на самом деле не говорят о двоичных деревьях! Они показывают вам троичные поисковые деревья! Истинные двоичные деревья хранят данные в своих листьях, а не во внутренних узлах (за исключением ключей для навигации). Некоторые называют эти листовые деревья и делают различие между деревьями узлов, показанными в учебниках:
J. Nievergelt, C.-K. Вонг: верхние границы для общей длины пути двоичных деревьев,
Журнал ACM 20 (1973) 1–6.
Следующее об этом из книги Питера Брасса о структурах данных.
2.1 Две модели поисковых деревьев
В только что приведенном наброске мы скрыли важный момент, который на первый взгляд кажется
тривиально, но на самом деле это приводит к двум различным моделям деревьев поиска, любой из
который может быть объединен с большей частью следующего материала, но один из которых
настоятельно предпочтительнее.
Если мы сравним в каждом узле ключ запроса с ключом, содержащимся в
узел и следуйте левой ветви, если ключ запроса меньше, а правой ветви
если ключ запроса больше, то что будет, если они равны? Две модели
деревья поиска выглядят следующим образом:
Возьмите левую ветвь, если ключ запроса меньше, чем ключ узла; в противном случае возьмите
Правая ветка, пока не дойдете до листа дерева. Ключи во внутреннем узле
из дерева только для сравнения; все объекты в листьях.
Возьмите левую ветвь, если ключ запроса меньше, чем ключ узла; взять правильную ветвь
если ключ запроса больше, чем ключ узла; и взять предмет, содержащийся
в узле, если они равны.
Этот второстепенный пункт имеет ряд последствий:
{В модели 1 базовое дерево представляет собой двоичное дерево, тогда как в модели 2 каждое
Узел дерева действительно является троичным узлом со специальным средним соседом.
{В модели 1 каждый внутренний узел имеет левое и правое поддерево (каждое возможно
лист дерева), в то время как в модели 2 мы должны допустить неполное
узлы, где левое или правое поддерево может отсутствовать, и только
объект сравнения и ключ гарантированно существуют.
Таким образом, структура дерева поиска модели 1 более правильная, чем у дерева
модели 2; это, по крайней мере, для реализации, явное преимущество.
{В модели 1 для обхода внутреннего узла требуется только одно сравнение,
в то время как в модели 2 нам нужно два сравнения, чтобы проверить три
возможности.
Действительно, деревья одинаковой высоты в моделях 1 и 2 содержат самое большее приблизительно
столько же объектов, но в модели нужно вдвое больше сравнений
2, чтобы достичь самых глубоких объектов дерева. Конечно, в модели 2 есть также
некоторые объекты, которые достигнуты гораздо раньше; объект в корне найден
только с двумя сравнениями, но почти все объекты находятся на или вблизи самого глубокого
уровень.
Теорема. Дерево высотой h и модель 1 содержит не более 2 ^ h объектов.
Дерево с высотой h и моделью 2 содержит не более 2 ^ h + 1 - 1 объектов.
Это легко увидеть, потому что дерево высоты h имеет как левое, так и правое поддеревья a
дерево высотой не более h - 1 каждое, а в модели 2 один дополнительный объект между
им.
{В модели 1 ключи во внутренних узлах служат только для сравнения и могут
вновь появиться в листьях для идентификации объектов. В модели 2 каждый
Ключ появляется только один раз вместе со своим объектом.
В модели 1 даже возможно, что для сравнения используются ключи, которые
не принадлежат ни одному объекту, например, если объект был удален. От
концептуально разделяя эти функции сравнения и идентификации, это
это не удивительно, и в более поздних структурах нам может даже понадобиться определить искусственное
тесты, не соответствующие ни одному объекту, просто чтобы получить хорошее разделение поиска
пространство. Все ключи, используемые для сравнения, обязательно различны, потому что в модели
1 дерево, каждый внутренний узел имеет непустые левое и правое поддеревья. Итак, каждый ключ
происходитсамое большее дважды, один раз как ключ сравнения и один раз как идентификационный ключ в листе.
Модель 2 стала предпочтительной версией учебника, потому что в большинстве учебников не проводится различие между объектом и его ключом: ключ является объектом,Тогда становится неестественным дублировать ключ в древовидной структуре.Но во всех реальных приложениях различие между ключом и объектом довольно важно.Почти никогда не хочется отслеживать только набор чисел;числа обычно связаны с некоторой дополнительной информацией, которая часто намного больше, чем сам ключ.