Каталог статей
0 Поиск в древовидной таблице
В предыдущем блоге был записан бинарный поиск, но для выполнения бинарного поиска требуется упорядочивание. Иногда неупорядоченные таблицы неудобны, поэтому можно использовать таблицы динамического поиска, которые представляют собой древовидные таблицы.
1 Дерево двоичной сортировки
Дерево двоичной сортировки (Binary Sort Tree) также называют двоичным деревом поиска и бинарным деревом поиска.
Определение:
Дерево двоичной сортировки — это либо пустое дерево, либо двоичное дерево, удовлетворяющее следующим свойствам:
- Если его левое поддерево не пусто, значения всех узлов левого поддерева меньше значения корневого узла.
- Если его правое поддерево не пусто, то значения всех узлов правого поддерева больше или равны значению корневого узла.
- Каждое левое и правое поддеревья представляют собой двоичное дерево сортировки.
Левое маленькое, а правое большое, левое < корень < правое.
Первое изображение представляет собой дерево двоичной сортировки.Все значения узлов левого поддерева меньше корневого узла 45, а все узлы правого поддерева больше корневого узла 45. На втором рисунке нет левого поддерева, а первые буквы всех слов в правом поддереве больше или равны корневому узлу, поэтому это тоже дерево двоичной сортировки. В третьем и четвертом примерах, поскольку следующий узел больше корневого узла, условие не выполняется.
Последовательность элементов данных, полученная путем упорядоченного обхода непустого двоичного отсортированного дерева, представляет собой возрастающую упорядоченную последовательность , упорядоченную по ключевому слову .
1.1 Работа бинарного дерева сортировки
Если объект, который вам нужно найти, меньше текущего корневого узла, вам нужно искать только в левом поддереве. Если он больше корневого узла, перейдите к правому поддереву, чтобы найти его. Если он равен корневому узлу. , вы вернетесь непосредственно к корневому узлу.
1.1.1 Хранение дерева двоичной сортировки
typedef struct
{
KeyType key; //关键字项
InfoType otherinfo; //其他数据域
}ElemType;
typedef struct BSTNode
{
ElemType data; //数据域
struct BSTNode *lchild, *rchild; //左孩子右孩子指针
}BSTNode, *BSTree;
BSTree T;//定义二叉排序树
1.1.2 Рекурсивный поиск дерева двоичной сортировки
Левое и правое поддеревья вызывают свои собственные алгоритмы поиска.
BSTree SearchBST(BSTree T, KeyType key)
{
if((!T)||key == T->data.key)
{
return T;
}
else if(key < T->data.key)
{
return SearchBST(T->lchild, key);//在左子树中继续查找
}
else
{
return SearchBST(T->rchild, key);//在右子树中继续查找
}
}
1.1.3 Вставка в бинарное дерево сортировки
Вставляемый узел меньше корневого узла, поэтому он помещается в левый дочерний элемент, а затем сравнивается с корневым узлом в левом дочернем элементе. Если он больше корневого узла, поместите правый дочерний узел и продолжите сравнение.
Мысль:
Вставленный узел должен находиться на листовом узле.
1.1.4 Генерация дерева двоичной сортировки
Неупорядоченную последовательность можно превратить в упорядоченную, построив двоичное дерево сортировки.Процесс построения дерева — это процесс сортировки неупорядоченной последовательности (обход по порядку).
Все вставленные узлы являются листовыми, поэтому нет необходимости перемещать другие узлы. Эквивалентно вставке записей в упорядоченной последовательности без перемещения других записей.
Однако:
порядок ввода ключевых слов разный, и устанавливаются разные деревья двоичной сортировки.
Если форма другая, эффективность поиска будет другой.
1.1.5 Удаление дерева двоичной сортировки
Наиболее важными являются последние два.
Если вы удаляете листовой узел, удалите его напрямую.
Удалите 20 и 88 напрямую и измените левых и правых дочерних элементов родителей.
Измените значение соответствующего поля указателя в родительском узле на «null» .
Удаленный узел имеет только левое поддерево или только правое поддерево. Замените его левым поддеревом или правым поддеревом (замена узла) и напрямую измените родительский указатель,
чтобы родители указывали непосредственно на левых и правых дочерних элементов удаленного узла. узел.
Удаленный узел имеет как левое, так и правое поддерево. В
этом случае нам все равно необходимо поддерживать порядок обхода. Что нам делать?
Один из способов — заменить его предшественником узла обхода по порядку . При этом сохраняется порядок обхода, поэтому мы находим его левое поддерево и заменяем его ближайшим к нему узлом.Здесь вместо 50 используется 40.
Конечно, вы также можете заменить его преемником, а затем удалить узел-преемник. Преемником является наименьший узел в правом поддереве . Здесь 80 заменяется на 50. После того, как 80 становится корневым узлом, линия прямо указывает на 90.
Некоторые примеры.
1.2 Анализ производительности поиска в дереве двоичной сортировки
Количество раз, которое необходимо искать в каждом узле, зависит от уровня дерева двоичной сортировки, на котором расположен узел. Процесс поиска узла в дереве двоичной сортировки, где определенное ключевое слово равно заданному значению, фактически выбирает путь от корня к узлу.
Подводя итог, можно сделать вывод , что количество сравнений ключевых слов = количеству уровней, на которых находится этот узел .
Что касается количества слоев, то лучше не превышать log 2 n + 1 log_2n+1.журнал о г2н+Уровень 1 , наихудший сценарий —nnСлой n — это ситуация на картинке справа.
Когда количество слоев максимальное, ASL такой же, как и при последовательном поиске.
2 Сбалансированное бинарное дерево (дерево AVL)
Вопрос: Как повысить эффективность поиска в деревьях двоичной сортировки несбалансированных форм?
Решение: Сделать «балансирующую» обработку, то есть попытаться сделать форму бинарного дерева максимально сбалансированной! Вот откуда берутся сбалансированные бинарные деревья.
Для удобства к каждому узлу добавляется число, обозначающее разницу высот между левым и правым поддеревом узла . Это число называется коэффициентом баланса узла (BF) .
Коэффициент баланса = высота левого поддерева узла - высота правого поддерева узла
Согласно определению сбалансированного двоичного дерева, коэффициенты баланса всех узлов сбалансированного двоичного дерева могут быть только -1,0,1.
Абсолютное значение меньше или равно 1, но не больше 1.
Для дерева с nnВысота AVL-дерева с n узлами остается равнойO (log 2 n) O(log_2n)О ( лог г _2n ) порядка величины, ASL также остается на уровнеO (log 2 n) O(log_2n)О ( лог г _2п ) величина.
2.1 Анализ и корректировка несбалансированного дерева бинарной сортировки
Если дисбаланс вызван вставкой нового узла в дерево AVL, структуру дерева необходимо перенастроить для восстановления баланса. (Узел 53 на рисунке выше несимметричен)
Если обнаружено, что после вставки узла обнаружено более одного несбалансированного узла, корневой узел минимального несбалансированного поддерева обнаруживается как несбалансированный узел.
Принципы регулировки:
- снизить высоту
- Сохраняйте свойства дерева двоичной сортировки (левое поддерево меньше корневого узла, а правое поддерево больше корневого узла), поэтому наименьшее из них помещается в крайнее левое положение.
2.1.1 Регулировка типа LL
Тип LL предназначен для вставки нового узла.Позиция вставки этого нового узла находится над левым поддеревом левого поддерева несбалансированного узла.
Регулировка:
опустить узел А и поднять узел В.
Или используйте метод сбалансированного вращения, просто уменьшите его.
2.1.2 Настройка типа RR
Тип RR предназначен для вставки нового узла.Позиция вставки этого нового узла находится над правым поддеревом правого поддерева несбалансированного узла.
Идея состоит в том, чтобы уменьшить высоту.
Пример:
Ответ:
2.1.3 Регулировка типа LR
Тип LR предназначен для вставки нового узла.Позиция вставки этого нового узла находится над правым поддеревом левого поддерева несбалансированного узла.
Корректировки по-прежнему должны быть внесены в соответствии с принципами.
Третий шаг размещен таким образом, чтобы сохранить характеристики дерева AVL.
2.1.4 Регулировка типа RL
Тип RL предназначен для вставки нового узла.Позиция вставки этого нового узла находится над левым поддеревом правого поддерева несбалансированного узла.
Похоже на дерево LR.
3. Постройте AVL-дерево на основе вышеуказанных типов.
Когда вставляется 7, обнаруживается, что он имеет тип LR, поэтому он корректируется в соответствии с типом LR, то есть узел 7 поднимается вверх, а затем 3 и 16 используются в качестве его левого и правого поддерева соответственно.
В это время снова появляется тип LL. Средний узел 11 поднимается напрямую, а затем один используется как его левый дочерний элемент, а другой — как его правый дочерний элемент.
После вставки узла 26 было обнаружено, что существует дисбаланс RR.
Затем произошел еще один дисбаланс RL.
RL и LR должны поднять среднее значение, а затем два других используются как левое и правое поддерево.
Если 3 вершины не сбалансированы, откорректируйте наименьшее поддерево. , то есть отмечено красным, это дисбаланс типа LR.
На этом этапе строится дерево AVL.