Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria

En el artículo Recorrido del árbol binario (por favor, pinchame), se presenta principalmente el recorrido del árbol de búsqueda binario. Este artículo continuará presentando la búsqueda del árbol de búsqueda binaria.

La búsqueda del segundo árbol de bifurcación de búsqueda implica principalmente buscar el nodo de elemento especificado, búsqueda máxima y mínima, y ​​buscar el nodo predecesor o sucesor del nodo especificado. Presentado por separado a continuación.

Encuentra el elemento especificado

El proceso de búsqueda de una clave de valor dada en un árbol de bifurcación de búsqueda binaria es muy similar a la búsqueda binaria. El proceso es: primero, la clave de la palabra clave se compara con la clave de la raíz del árbol. Si la clave es mayor que la clave de la raíz, entonces la clave es Busque en el subárbol derecho, de lo contrario busque en el subárbol izquierdo de la raíz. Repita este proceso hasta que encuentre o encuentre un nodo vacío. La siguiente figura muestra el proceso de búsqueda de una clave de 2 nodos.
Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria

Según el proceso de búsqueda, las implementaciones de código recursivas y no recursivas son las siguientes:

//查找值为key的节点,递归版本
Node* bstree_search(BSTree root, Type key)
{
    if (root==NULL || root->key==key)
        return root;

    if (key < root->key)
        return bstree_search(root->left, key);
    else
        return bstree_search(root->right, key);
}
//查找值为key的节点,非递归版本
Node* iterative_bstree_search(BSTree root, Type key)
{
    while ((root!=NULL) && (root->key!=key))
    {
        if (key < root->key)
            root = root->left;
        else
            root = root->right;
    }

    return root;
}

Encuentra los valores máximo y mínimo

De acuerdo con la naturaleza del árbol de búsqueda binaria, es fácil pensar: un árbol de búsqueda binario no vacío encuentra su valor máximo El proceso es simple: solo es necesario atravesar recursivamente desde el nodo raíz al nodo del subárbol derecho. Cuando el hijo derecho del nodo atravesado es NULL, este nodo es el valor máximo del árbol, como se muestra en la siguiente figura.

De la misma manera, el proceso de encontrar su valor mínimo es similar: atraviesa recursivamente desde el nodo raíz al nodo del subárbol izquierdo. Cuando el hijo izquierdo del nodo atravesado es NULL, este nodo es el valor mínimo del árbol.
Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria

La implementación del código para encontrar el valor máximo se da a continuación. El valor mínimo es similar. Puede intentar encontrar el valor mínimo usted mismo.

//查找最大值
Node* bstree_maximum(BSTree root)
{
    if (root == NULL)
        return NULL;

    while(root->right != NULL)
        root = root->right;
    return root;
}

Encuentra nodos predecesores y sucesores

Los nodos predecesores y sucesores de un nodo mencionado aquí se refieren al predecesor y sucesor de un nodo en la secuencia transversal en orden; con más detalle: para un árbol de búsqueda binario, el predecesor de un nodo x es menor que la clave El nodo más grande entre todas las palabras clave en [x], el sucesor es el nodo más pequeño entre todas las palabras clave en la clave [x].

Encuentra los pasos precursores:

(1) Primero juzgue si el nodo x tiene un subárbol izquierdo. Si hay un subárbol izquierdo, el nodo más grande de su subárbol izquierdo es el predecesor de x;
(2) Si no hay un subárbol izquierdo, pero el nodo está a la derecha de su nodo padre Hijo, entonces el nodo padre es el nodo predecesor del nodo;
(3) Si no hay un árbol hijo izquierdo, pero el nodo es el hijo izquierdo de su nodo padre, entonces debe buscar la parte superior del árbol a lo largo de su nodo padre hasta encontrar uno. Nodo P, el nodo P es el hijo derecho de su nodo padre Q, entonces Q es el nodo predecesor de este nodo.

Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria
Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria
Pasos para encontrar nodos sucesores:
(1) Primero juzgue si el nodo x tiene un subárbol derecho, si hay un subárbol derecho, el nodo más pequeño de su subárbol derecho es el predecesor de x;
(2) Si no hay un subárbol derecho, pero este nodo Es el hijo izquierdo de su nodo padre, entonces el nodo padre es el nodo sucesor del nodo;
(3) Si no hay un árbol hijo derecho, pero el nodo es el hijo derecho de su nodo padre, entonces debe seguir a su nodo padre hasta el árbol. Busque en la parte superior hasta que encuentre un nodo P, que es el hijo izquierdo de su nodo padre Q, luego Q es el sucesor de este nodo.

Para el tercer caso, el texto puede ser un poco abstracto. Usemos una imagen para demostrarlo. Por ejemplo, la siguiente figura encuentra el proceso del nodo sucesor 15 del nodo 13:
Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria

La implementación del código de la búsqueda del nodo predecesor se muestra a continuación. El nodo sucesor es similar. Puede intentar implementar el código de búsqueda del nodo sucesor usted mismo.

//查找节点x的前驱节点Node* bstree_predecessor(Node *x)
{
    /* 如果x存在左孩子,则"x的前驱结点"为     
    "以其左孩子为根的子树的最大结点"。*/
    if (x->left != NULL)
        return bstree_maximum(x->left);

    // 如果x没有左孩子。则x有以下两种可能:
    // (01) x是"一个右孩子",则"x的前驱结点"为 "它的父结点"。
    /* (02) x是"一个左孩子",则查找"x的最低的父结点,            
            并且该父结点要具有右孩子",找到的这个"最低的父结点"            
            就是"x的前驱结点"。*/
    Node* y = x->parent;
    while ((y!=NULL) && (x==y->left))
    {
        x = y;
        y = y->parent;
    }

    return y;
}

Lectura recomendada:

[Bienestar] Uso compartido de videos de cursos boutique en línea recopilados por mí mismo ( Parte 1 )
[Diseño del sistema] Caché LRU
[Estructura de datos y algoritmo] Árbol de búsqueda binaria fácil de entender
[Estructura de datos y algoritmo] Lista enlazada fácil de entender
[Estructura de datos y algoritmo ] Explicación fácil de entender de la ordenación de bits
[Notas de C ++] Programación simultánea de C ++ 11 (1) Inicie el viaje del hilo
[Notas de C ++] Errores comunes al usar punteros de C / C ++

Céntrese en compartir resumen de conocimientos de pila de tecnología de fondo del servidor

Bienvenido a prestar atención a la comunicación y al progreso común.

Estructura de datos y algoritmo] Explicación fácil de entender de la búsqueda de árbol de búsqueda binaria

Codificación

¡El productor de códigos tiene la manera correcta de proporcionarle artículos técnicos fáciles de entender para facilitar la tecnología!

Supongo que te gusta

Origin blog.51cto.com/15006953/2552023
Recomendado
Clasificación