AVL/B-/+ Поиск по дереву

0 Поиск в древовидной таблице

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

1 Дерево двоичной сортировки

Дерево двоичной сортировки (Binary Sort Tree) также называют двоичным деревом поиска и бинарным деревом поиска.
Определение:
Дерево двоичной сортировки — это либо пустое дерево, либо двоичное дерево, удовлетворяющее следующим свойствам:

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

Левое маленькое, а правое большое, левое < корень < правое.

Вставьте сюда описание изображения
Первое изображение представляет собой дерево двоичной сортировки.Все значения узлов левого поддерева меньше корневого узла 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 на рисунке выше несимметричен)

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

  1. снизить высоту
  2. Сохраняйте свойства дерева двоичной сортировки (левое поддерево меньше корневого узла, а правое поддерево больше корневого узла), поэтому наименьшее из них помещается в крайнее левое положение.

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.

Supongo que te gusta

Origin blog.csdn.net/weixin_44673253/article/details/126207166
Recomendado
Clasificación