Реализация двоичного дерева поиска


Опубликованно 14.08.2018 07:54

Реализация двоичного дерева поиска

Двоичное дерево поиска — структура базы данных, содержащей узлов, обе ссылки на другие сайты, направо и налево. Узлы-это объект класса, который имеет данные и NULL — знак, означающий конец вала.

Это часто упоминается как BST, имеющие специальные свойства: сайты более корень справа от него, и маленькие слева. Теория и терминология

Из бинарного дерева поиска каждый узел, за исключением корневого каталога, связанный, направленных прямо с одного узла на другой, который называется родителем. Каждый из них может быть подключен к количество узлов, которые называются детьми. Узлов без их "детьми" называются листов (внешние сайты). Элементы, которые не являются листьями, называются внутренними. Узлы одного и того же родителя-это братья и сестры. Самый верхний узел называется корнем. BST предписано элемент каждого узла и безопасно для них имеет специальное свойство.

Терминология вала: Глубина узла-это число ребер, уверен, от корня до него. Высота узла-это число ребер, определенной ему до глубины листа. Высота дерева — определяется высотой корня. Двоичное дерево поиска — специальный дизайн, он предлагает лучшее соотношение между высотой и количество узлов. Высота h с N узлами не более O (log N).

Вы можете это легко доказать, по числу узлов на каждом уровне, начиная с корня, так как он содержит самое большое количество из них: n = 1 + 2 + 4 + ... + 2 h-1 + 2 h = 2 h + 1 - 1 это, Решив h, получим h = O (log n).

Преимущества древесины: Отражают структурные отношения данных. Используются для представления иерархий. Гарантировать эффективность установки и поиск. Деревья — очень гибкая данные, позволяющие перемещать поддеревьев с минимальными усилиями. Метод поиска

В общем случае, для того, чтобы определить, является ли это значение в BST, начинают двоичное дерево поиска c его корня, и определяют, соответствует ли оно требованиям: находиться в корневом каталоге; найти поддерева корня; в поддереве корня.

Если нет базы реестра не делает, рекурсивный поиск в поддереве. В самом деле, есть два базовых варианта: Дерево пустое — return false. Значение находится в корневой узел — возвращает true.

Нужно обратить внимание, что двоичное дерево поиска c разработана схема начинает поиск, всегда на пути от корня до листа. В худшем случае, он будет всю дорогу на лист. Таким образом, худшее время пропорционально длине самого длинного пути от корня до листа, который является высотой дерева. В целом, это когда вам нужно знать, сколько времени требуется для исследования как функция количество значений, хранящихся в дереве.

Другими словами, существует связь между числом узлов в BST и высота деревьев, в зависимости от его «формы». В худшем случае узлы имеют только одного ребенка, и сбалансированное двоичное дерево поиска, в основном связанный список. Например:

50

/

10

15

30

/

20

Это дерево имеет 5 узлов, а высота = 5. Для поиска значений в диапазоне от 16 до 19 и 21 и 29 нужно далее путь от корня до листа (узел, содержащий значение 20), т. е. взять время, пропорциональное числу узлов. В лучшем случае, они имеют 2 детей, а листья находятся на одной глубине.

Это бинарное дерево поиска имеет 7 узлов, а высота = 3. В общем случае вал (вал), будет иметь высоту около log 2 (N), где N-количество узлов в дереве. Значение log 2 (N) - это количество раз (2), когда можно разделить N, до достижения нуля.

Подводя итог: хуже, время, необходимое для поиска в BST, равна O (высота дерева). В худшем случае «линейной» дерево-это O (N), где N-количество узлов в дереве. В лучшем случае «полный», дерево O (log N). Бинарные вставки, BST

Интересно, где должен быть расположен новый узел в BST, вы должны понять логику, он должен быть помещен в месте, где найдет пользователя. Кроме того, необходимо помнить правила: Дубликаты не допускаются, попытка вставить значение, вызовет исключение. Метод public insert использует метод рекурсивного «мастер» для фактической вставки. Узел, содержащий новое значение всегда вставляется как лист в BST. Открытый метод insert возвращает void, но метод возвращает BSTnode. Он делает это, чтобы обработать случай, когда узел, который передан ей равна нулю.

В общем случае, вспомогательный метод показывает, что если изначально бинарное дерево поиска пуст, результат-дерево с одним узлом. В противном случае, результатом является указатель на узел, который был передан в качестве аргумента. Удаление алгоритм двоичного

Как и следовало ожидать, удаление элемента, связанного с поиском, находящий узел, содержащий значение, которое вы хотите удалить. В этом коде есть несколько вещей: BST использует вспомогательный, перегруженный метод удаления. Если то, что вы ищете, не в дереве, а затем, наконец, метод будет вызван с n == null. Это не рассматривается как ошибка, дерева, в этом случае, просто не изменить. Метод удаления возвращает указатель на продление дерево. При удалении таблицы, при удалении дерева бинарного поиска устанавливает ребенка указатель родителей, на ноль или корень значение null, если узел является корневым, и он не имеет детей. Вы должны обратить внимание на то, что вызов для удаления должен быть одним из следующих: root = "delete" (root key), (n).setLeft (delete (n).getLeft (), key)), (n).setRight (delete (n).getRight (), key)). Таким образом, во всех трех случаях, правильно, когда метод delete возвращает null. Когда поиск узла, содержащего одноразовые значение, получается, есть три варианта: сайт удаление листа (без детей), удалить узел, имеет ребенка, имеет двоих детей. При удалении узел имеет только одного ребенка, вы можете просто заменить его потомком, возвращая указатель на дочерний элемент. Если узел имеет ноль или 1 ребенок, то метод удаления-это «путь от корня до данного узла. Таким образом, самое худшее время пропорционально высоте дерева, как для поиска, и вставки.

Если узел имеет двух детей, выполните следующие действия: Найти удаление узла, далее, путь от корня к ним. Найти наименьшее значение v в дерево, продолжая движение на путь листа. Рекурсивно удалить значение v, пойти по тому же пути, что и в пункте 2. Таким образом, в худшем случае, путь от корня к листу выполняется два раза. Заказ через

Способ обхода (Traversal) — это процесс, который посещает все узлы в дереве. Как бинарное дерево поиска, если это не линейная структура данных обхода не существует. Например, иногда несколько алгоритмов обхода сгруппированы в два типа: пересечение глубину; первый проход.

Существует только один тип пересечения ширина — пересечение уровней. Это пересечение посещение сайтов по уровням вниз и влево, вверх и вправо.

Существуют три различных типов пересечений глубина: Переход от предварительного заказа — сначала посетите родителей, а затем слева и справа от ребенка. Переход от InOrder — посещение углу ребенка, затем родителей, и хороший ребенок. Обойти PostOrder — тур слева от дочернего элемента, а затем хороший ребенок, и родитель.

Например, для четырех анализов двоичное дерево поиска: Предзаказ - 8, 5, 9, 7, 1, 12, 2, 4, 11, 3. InOrder - 9, 5, 1, 7, 2, 12, 8, 4, 3, 11. PostOrder - 9, 1, 2, 12, 7, 5, 3, 11, 4, 8. LevelOrder - 8, 5, 4, 9, 7, 11, 1, 12, 3, 2.

На рисунке показана последовательность посещения сайтов. Число 1-это первый узел в ходе анализа, и 7 — последний узел.

Эти анализы могут быть представлены в одном алгоритме, предполагается, что каждый узел посещают три раза. Euler экскурсия - прогулка вокруг двоичное дерево, где каждое ребро рассматривается как стена, что пользователь не может пересечь. В этой набережной каждый узел быть просмотрены либо слева, либо снизу, либо справа. Круг Эйлера, которые могут быть посещенных узлов слева, называется обход предлог. Когда посещают сайты ниже, получают в обход порядка. И когда посетил узлы справа — получают оперативного анализа.

Навигация и отладки

Для того, чтобы облегчить движение вал, создавать функции, которые проверяют, являются ли они влево или вправо, и к ребенку. Чтобы изменить положение узла должен быть легкий доступ к руководству родительского узла. Правильно реализовать дерево очень сложно, поэтому вы должны знать и применять в процессе отладки. Из бинарного дерева поиска c реализации часто встречаются указатели, которые на самом деле направление не указывать.

Чтобы понять все это, используйте функцию, которая проверяет, является ли дерево быть правильным, и поможет найти много ошибок. Например, проверяет, если родительский узел узла ребенка. С помощью assert (is_wellformed (root)), многие ошибки могут быть преждевременно перехвачены. С помощью пары заданных точек контроля внутри этой функции, вы можете также определить, какой именно указатель неисправностей. Функция Konsolenausgabe

Эта функция сбрасывает дереве консоли, и поэтому очень полезно. Порядок достижения цели вывод вала: Чтобы сделать это, вы должны сначала определить, какая информация будет сделано через узел. И также нужно знать, сколько широкий и высокий деревянный, с учетом, сколько вам необходимо оставить свободного пространства. Следующие функции вычисляют эти сведения для дерева, и для каждого поддерева. Потому, что вы можете написать в консоли только на линии, вы также должны показать дерево строк. Теперь другой выход из всего дерева, а не только в интернете. С помощью функции очистки, вы можете прочитать дерева и значительно улучшить алгоритм вывода, потому что это касается скорости.

Тем не менее, эта функция будет трудно использовать на больших деревьях. Конструктор копирования и деструктор

Так как дерево не является тривиальным структуры данных, лучше реализовать конструктор копирования, деструктор и оператор присваивания. Деструктор-это легко реализовать рекурсивно. Для очень больших деревьев, он может справиться с «heap overflow». В этом случае формулируют итерационно. Идея состоит в том, чтобы удалить лист, который представляет собой наименьшее значение из всех листьев, так что он находится на левой стороне дерева. Вырезать первые листья создает новые, и дерево сжимается, пока он, наконец, прекратит свое существование.

Конструктор копирования может также быть реализован рекурсивно, но нужно быть осторожным, если исключение устранено. В противном случае дерево быстро становится сложным и подверженным ошибкам. Поэтому предпочитают итеративной версии. Идея заключается в том, чтобы пройти через старый и новый лес, как это делается в деструкторе, клонируя все узлы, которые находятся в старое дерево, но не новые.

С помощью этого метода реализации двоичное дерево поиска всегда в здоровом состоянии и может быть удалена, деструктор, даже в незавершенном состоянии. Если исключение происходит, вам нужно только дать команду уничтожения удалить драйвер вал. Оператор присваивания может быть легко реализован с помощью Copy & Swap. Создание двоичного дерева поиска

Оптимальное двоичное дерево поиска невероятно эффективны, если они будут правильно управлять. Несколько правил для двоичных поисковых деревьев: Родительский узел имеет более 2 дочерних узлов. Слева от дочернего узла всегда меньше родительского узла. Правильный узел ребенок всегда выше или равна родительского узла.

Таблица, которая будет использоваться для построения бинарного дерева поиска: Базовый целочисленный массив, состоящий из семи значений, которые не отсортирован в порядке. Первое значение в таблице равно 10, поэтому первым шагом при построении дерева будет создавать 10 корень сайта, как показано здесь. С набором корневых узлов, все значения под элементы сайта. Ссылаясь на правила первый шаг, чтобы следовать, чтобы добавить 7 в дерево, это будет сравнение с корневого узла. Если значение 7 в пределах 10, то он станет левый дочерний узел. Если значение 7 больше или равна 10, то он будет двигаться вправо. Потому что мы знаем, что 7 меньше 10, показывают, что левый дочерний узел. Рекурсивно делать сравнения для каждого элемента. Следуя той же схеме, выполнить то же сравнение с 14 значение в таблицу. Сравнивая значение 14 с корневого узла, 10, зная, что 14 правильное для ребенка. Пробираясь через массив, приходят в 20. Начинается сравнение этой таблицы с 10. Таким образом, двигаться вправо, и сравнивают до 14, более 14 и не имеет детей направо. Теперь есть значение 1. Следуя той же схеме, что и другие значения, сравнивают с 1 до 10, проходящий влево и сравнивая их с 7 и, наконец, с 1 слева от дочернего элемента, 7-й узел. Если значение 5, сравнивают с 10. Потому что 5 меньше 10, перемещаются влево и сравнивают его с 7. Зная, что 5 меньше 7, далее вниз по дереву и сравнивают 5 1 значение. Если 1 не имеет дочерних узлов, и 5 — более 1, 5 — хороший ребенок, 1 узла. Наконец, введите значение 8 в лесу. При 8, меньше 10, перемещают его влево, и сравниваем с 7, 8 7, поэтому движутся вправо и дополнить дерева, что делает 8 хороший ребенок 7.

Получаем и оцениваем простой элегантности оптимальных бинарных деревьев поиска. Как и многие другие темы в программировании, силы двоичных деревьев поиска, зависит от их способности решить разбиение данных на небольшие компоненты. С этого момента вы можете работать с полным набором данных, организованно. Потенциальные проблемы двоичного поиска

Двоичных деревьев поиска хороши, но есть некоторые предостережения, чтобы помнить. Они, как правило, эффективны, только если сбалансированный. Сбалансированное дерево-это дерево,в котором разница между высотами поддеревьев любого узла в дереве не больше единицы. Рассмотрим пример, который может помочь прояснить правила. Представьте, что массив начинается, как отсортирован.

Если вы попытаетесь запустить алгоритм дерево бинарного поиска, в этом дереве, он будет выполнять точно так же, как если просто повторить таблицу, пока не будет найдено искомое значение. Силы двоичного поиска это возможность отфильтровать ненужные значения. Когда вал не сбалансирован, он не даст таких преимуществ, как btree.

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

Вы должны определить, какое дерево получится, если вставлен 25 в двоичное дерево поиска:

10

/

/

5 15

/ /

/ /

2 12 20

Когда вставляют x в дереве T, который не содержит x, x ключ, он всегда помещается в новый лист. И что новое дерево будет:

10

/

/

5 15

/ /

/ /

2 12 20

25

Какое дерево будет получено, если вы установите 7 в двоичное дерево поиска?

10

/

/

5 15

/ /

/ /

2 12 20

Ответ:

10

/

/

/

5 15

/ /

/ /

2 7 12 20

Двоичное дерево поиска может быть использован для хранения объектов. Преимущества использования двоичного дерева поиска, а не связанный список является то, что если дерево достаточно сбалансированы и выглядит более «полное» дерево, чем «линейный», вставка, поиск, и все операции удаления могут быть реализованы для выполнения O (log N) времени. Автор: Иван 26 Июля 2018 Года



Категория: Культура