Revisión de la estructura de datos [7.3.1 Búsqueda de tabla de árbol - árbol de clasificación binaria]
introducción
Cuando las operaciones de inserción y eliminación de la tabla son frecuentes, para mantener el orden de la tabla, necesitamos mover muchos registros en la tabla; en su lugar, podemos usar una tabla de búsqueda dinámica, usando varios árboles especiales (árbol de clasificación binaria, árbol binario equilibrado, árbol rojo-negro, B+, B-, árbol de claves, etc.), de modo que la estructura de la tabla se genera dinámicamente durante el proceso de búsqueda.
1. Árbol de clasificación binario (árbol de búsqueda binario, árbol de búsqueda)
1. Definición
Un árbol ordenado binario es un árbol vacío o un árbol binario que cumple las siguientes propiedades:
(1) Si su subárbol izquierdo no está vacío, entonces los valores de左子树
todos los nodos en él均小于根节点
.
(2) Si su subárbol derecho no está vacío, entonces los valores右子树
de todos los nodos de arriba均大于等于根节点
.
(3) Otro árbol左右子树
en sí mismo .是
二叉排序树
2. Naturaleza
La secuencia de elementos de datos obtenidos mediante el recorrido en orden de un árbol de clasificación binario no vacío es una secuencia
按关键字排列
de uno递增有序
.
3. Buscar operación
La palabra clave de búsqueda es igual al nodo raíz,
查找成功
de lo contrario, (1) si es menor que el nodo raíz, verifique su subárbol izquierdo (2) si es mayor que el nodo raíz, después de verificar su subárbol derecho, la operación en
el los subárboles izquierdo y derecho son similares, la búsqueda Devuelve un puntero nulo en caso de falla.
3.1 Códigos relacionados
3.1.1 Estructura de almacenamiento del árbol de clasificación de árboles binarios
typedef struct{
KeyType key; //关键字项
InfoType otherinfo; //其他数据域
} ElemType;
typedef struct BSTNode{
ElemType data; //数据域
struct BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree;
BSTtree T; //定义二叉排序树T
3.1.2 Algoritmo de búsqueda recursiva
[Idea de algoritmo]
(1) Si el árbol binario está vacío, la búsqueda falla y se devuelve un puntero nulo
(2) Si el árbol binario no está vacío, compare la clave de valor dada con la palabra clave T->data.key de la nodo raíz:
① la clave es igual a T ->data.key, la búsqueda es exitosa, devuelve la dirección del nodo raíz
② la clave es menor que T->data.key, busque más en el subárbol izquierdo
② la clave es mayor que T-> data.key, busque más en el subárbol derecho
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 Análisis de eficiencia
Un árbol ordenado binario con n nodos relacionados con
平均查找长度
y树的形态
.
(1) Mejor caso: árbol binario completo, se convierte en判定树
, y折半查找相同
, ASL= log2(N+1) -1, O(log2N)
(2) Peor caso: ordenado al principio, se convierte en右斜树
, y顺序查找形同
, ASL= (N+1) )/2, O(s)
4. Insertar operación
Si el árbol de clasificación binaria está vacío, inserte el nodo como el nodo raíz en el árbol vacío
De lo contrario, continúe buscando en sus subárboles izquierdo y derecho
① Si existe en el árbol, no lo inserte más
② Si no lo hace existe en el árbol, búsquelo e insértelo en el elemento secundario izquierdo o derecho de un determinado nodo.
5. Generar operaciones
构造树的过程
(1) Una secuencia desordenada se puede convertir en una secuencia ordenada mediante la construcción de un árbol de clasificación binaria是对无序序列进行排序的过程
. Los nodos de
(2) son , por lo tanto , . Y otros registros. (3)插入
叶子结点
无须移动其他节点
相当于在有序序列上插入记录
无需移动
关键字的输入顺序不同,建立的二叉排序树不同。
6. Operación de eliminación
删除
para permanecer保证所得二叉树仍然满足二叉排序树的性质
sin cambios.
Dado que un recorrido en orden de un árbol de clasificación binaria puede obtener una secuencia ordenada incrementalmente, eliminar un nodo es equivalente a eliminar un nodo en la secuencia ordenada.
6.1 Eliminar nodos hoja
直接删除
Para este nodo, cambie el valor del campo de puntero correspondiente en el nodo principal a vacío即可
.
6.2 Eliminar el nodo que contiene el subárbol izquierdo (o subárbol derecho)
Simplemente utilícelo
左子树
(o el subárbol derecho)替换自身结点
.
6.3 Eliminar el nodo que contiene los subárboles izquierdo y derecho
Reemplácelo directamente con recorrido en orden
前驱节点
o , entre ellos: (1) : el nodo más grande en el subárbol izquierdo. (ie ) (1) : El nodo más pequeño en el subárbol derecho. (es decir )后继节点
自身结点
前驱节点
当前结点-> 左孩子 -> 右孩子 -> 右孩子 …
后继节点
当前结点-> 右孩子 -> 左孩子 -> 左孩子 …