Обзор структуры данных [7.3.1 Поиск в древовидной таблице — бинарное дерево сортировки]
введение
Когда операции вставки и удаления таблицы часты, для поддержания порядка таблицы нам нужно переместить много записей в таблице — вместо этого мы можем использовать динамическую таблицу поиска, используя несколько специальных деревьев (бинарное дерево сортировки, сбалансированное бинарное дерево, красно-черное дерево, B+, B-, ключевое дерево и т. д.), так что структура таблицы динамически генерируется в процессе поиска.
1. Бинарное дерево сортировки (бинарное дерево поиска, дерево поиска)
1. Определение
Бинарное отсортированное дерево — это либо пустое дерево, либо бинарное дерево, удовлетворяющее следующим свойствам:
(1) Если его левое поддерево не пусто, то значения左子树
всех узлов на нем均小于根节点
.
(2) Если его правое поддерево не пусто, то значения右子树
всех узлов выше均大于等于根节点
.
(3) Еще одно дерево左右子树
само по себе .是
二叉排序树
2. Природа
Последовательность элементов данных, полученных неупорядоченным обходом непустого бинарного дерева сортировки, представляет собой последовательность
按关键字排列
из одного递增有序
.
3. Найти операцию
Ключевое слово поиска равно корневому узлу,
查找成功
иначе, (1) если оно меньше корневого узла, проверить его левое поддерево (2) если оно больше корневого узла, после проверки его правого поддерева операция
над левое и правое поддеревья похожи, поиск возвращает нулевой указатель в случае ошибки.
3.1. Связанные коды
3.1.1 Структура хранения дерева сортировки бинарного дерева
typedef struct{
KeyType key; //关键字项
InfoType otherinfo; //其他数据域
} ElemType;
typedef struct BSTNode{
ElemType data; //数据域
struct BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree;
BSTtree T; //定义二叉排序树T
3.1.2 Алгоритм рекурсивного поиска
[Идея алгоритма]
(1) Если бинарное дерево пусто, поиск завершается ошибкой и возвращается нулевой указатель
(2) Если бинарное дерево не пусто, сравнить данный ключ значения с ключевым словом T->data.key из корневой узел:
① ключ равен T -> data.key, поиск успешен, вернуть адрес корневого узла
② ключ меньше, чем T->data.key, дальнейший поиск левого поддерева
② ключ больше, чем T-> data.key, дальнейший поиск в правом поддереве
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); //在右子树中继续查找
}
3.2 Анализ эффективности
Бинарное отсортированное дерево с n узлами, связанными с
平均查找长度
и树的形态
.
(1) В лучшем случае: полное бинарное дерево становится判定树
, и折半查找相同
, ASL= log2(N+1) -1, O(log2N)
(2) В худшем случае: упорядоченное в начале, становится右斜树
, и顺序查找形同
, ASL= (N+1 )/2, О(п)
4. Операция вставки
Если двоичное дерево сортировки пусто, вставьте узел в качестве корневого узла в пустое дерево.
В противном случае продолжайте поиск в его левом и правом поддеревьях
① Если он существует в дереве, больше не вставляйте его
② Если он не существует в дереве, найдите и вставьте его в левый или правый дочерний узел определенного узла.
5. Генерация операций
构造树的过程
(1) Неупорядоченную последовательность можно преобразовать в упорядоченную, построив бинарное дерево сортировки是对无序序列进行排序的过程
. Узлы
(2) , поэтому . И другие записи. (3)插入
叶子结点
无须移动其他节点
相当于在有序序列上插入记录
无需移动
关键字的输入顺序不同,建立的二叉排序树不同。
6. Удалить операцию
删除
остаться保证所得二叉树仍然满足二叉排序树的性质
без изменений.
Поскольку упорядоченный обход бинарного дерева сортировки может получить последовательно упорядоченную последовательность, удаление узла эквивалентно удалению узла в упорядоченной последовательности.
6.1 Удаление конечных узлов
直接删除
Для этого узла измените значение соответствующего поля указателя в родительском узле на пустое即可
.
6.2 Удалить узел, содержащий левое поддерево (или правое поддерево)
Просто используйте его
左子树
(или правильное поддерево)替换自身结点
.
6.3 Удалить узел, содержащий левое и правое поддеревья
Непосредственно замените его неупорядоченным обходом
前驱节点
или , среди них: (1) : Самый большой узел в левом поддереве. (т.е. ) (1) : Наименьший узел в правом поддереве. (т.е. )后继节点
自身结点
前驱节点
当前结点-> 左孩子 -> 右孩子 -> 右孩子 …
后继节点
当前结点-> 右孩子 -> 左孩子 -> 左孩子 …