Обзор структуры данных [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) : Наименьший узел в правом поддереве. (т.е. )后继节点自身结点
前驱节点当前结点-> 左孩子 -> 右孩子 -> 右孩子 …
后继节点当前结点-> 右孩子 -> 左孩子 -> 左孩子 …

Guess you like

Origin blog.csdn.net/qq_41794040/article/details/108080659