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 )后继节点自身结点
前驱节点当前结点-> 左孩子 -> 右孩子 -> 右孩子 …
后继节点当前结点-> 右孩子 -> 左孩子 -> 左孩子 …

Supongo que te gusta

Origin blog.csdn.net/qq_41794040/article/details/108080659
Recomendado
Clasificación