Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire

Dans l'article Traversée de l'arbre binaire (poussez-moi s'il vous plaît), la traversée de l'arbre de recherche binaire est principalement introduite.Cet article continuera à présenter la recherche de l'arbre de recherche binaire.

La recherche du deuxième arbre de fourche de recherche implique principalement la recherche du nœud d'élément spécifié, la recherche maximale et minimale et la recherche du nœud prédécesseur ou successeur du nœud spécifié. Présenté séparément ci-dessous.

Rechercher l'élément spécifié

Le processus de recherche d'une clé de valeur donnée dans un arbre de fourche de recherche binaire est très similaire à la recherche binaire. Le processus est le suivant: premièrement, la clé de mot-clé est comparée à la clé de la racine de l'arbre. Si la clé est supérieure à la clé de la racine, alors la clé de la racine est Recherchez dans le sous-arbre de droite, sinon recherchez dans le sous-arbre de gauche de la racine. Répétez ce processus jusqu'à ce qu'un nœud vide soit trouvé ou rencontré. La figure suivante montre le processus de recherche d'une clé de 2 nœuds.
Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire

Selon le processus de recherche, les implémentations de code récursif et non récursif sont les suivantes:

//查找值为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;
}

Trouvez les valeurs maximales et minimales

Selon la nature de l'arbre de recherche binaire, il est facile de penser: un arbre de recherche binaire non vide trouve sa valeur maximale Le processus est simple: il suffit de passer récursivement du nœud racine au nœud de sous-arbre droit. Lorsque l'enfant droit du nœud traversé est NULL, ce nœud est la valeur maximale de l'arborescence, comme illustré dans la figure suivante.

De la même manière, le processus de recherche de la valeur minimale est similaire: passage récursif du nœud racine au nœud de sous-arbre gauche. Lorsque l'enfant gauche du nœud traversé est NULL, ce nœud est la valeur minimale de l'arborescence.
Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire

L'implémentation du code pour trouver la valeur maximale est donnée ci-dessous. La valeur minimale est similaire. Vous pouvez essayer de trouver la valeur minimale vous-même.

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

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

Rechercher des nœuds prédécesseurs et successeurs

Les nœuds prédécesseurs et successeurs d'un nœud mentionnés ici font référence au prédécesseur et au successeur d'un certain nœud dans la séquence de parcours dans l'ordre; plus en détail: pour un arbre de recherche binaire, le prédécesseur d'un certain nœud x est inférieur à la clé Le plus grand nœud parmi tous les mots-clés de [x], le successeur est le plus petit nœud parmi tous les mots-clés de la clé [x].

Trouvez les étapes précurseurs:

(1) Commencez par déterminer si le nœud x a un sous-arbre gauche. S'il y a un sous-arbre gauche, le plus grand nœud de son sous-arbre gauche est le prédécesseur de x;
(2) S'il n'y a pas de sous-arbre gauche, mais que le nœud est à droite de son nœud parent Enfant, le nœud parent est le nœud prédécesseur du nœud;
(3) S'il n'y a pas d'arborescence enfant à gauche, mais que le nœud est l'enfant gauche de son nœud parent, vous devez rechercher le haut de l'arborescence le long de son nœud parent jusqu'à ce que vous en trouviez un Le nœud P, le nœud P est le bon enfant de son nœud parent Q, alors Q est le nœud prédécesseur de ce nœud.

Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire
Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire
Étapes pour trouver les nœuds successeurs:
(1) Premièrement, juger si le nœud x a un sous-arbre droit, s'il y a un sous-arbre droit, le plus petit nœud de son sous-arbre droit est le prédécesseur de x;
(2) S'il n'y a pas de sous-arbre droit, mais ce nœud Est l'enfant gauche de son nœud parent, alors le nœud parent est le nœud successeur du nœud;
(3) S'il n'y a pas d'arbre enfant droit, mais que le nœud est l'enfant droit de son nœud parent, alors il doit suivre son nœud parent jusqu'à l'arborescence Recherche en haut jusqu'à ce qu'il trouve un nœud P, qui est l'enfant gauche de son nœud parent Q, alors Q est le successeur de ce nœud.

Dans le troisième cas, le texte peut être un peu abstrait. Utilisons une image pour le démontrer. Par exemple, la figure suivante trouve le processus du nœud successeur 15 du nœud 13:
Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire

L'implémentation du code de la recherche de nœud prédécesseur est donnée ci-dessous. Le nœud successeur est similaire. Vous pouvez essayer d'implémenter vous-même le code de recherche de nœud successeur.

//查找节点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;
}

Lecture recommandée:

[Bien-être] Partage vidéo des cours de boutique en ligne collectés par moi-même ( Partie 1 )
[Conception du système] Cache LRU
[Structure des données et algorithme] Arbre de recherche binaire facile à comprendre
[Structure des données et algorithme] Liste liée facile à comprendre
[Structure des données et algorithme ] Explication facile à comprendre du tri des bits
[Notes C ++] Programmation simultanée C ++ 11 (1) Démarrez le parcours des threads
[Notes C ++] Pièges courants dans l'utilisation des pointeurs C / C ++

Focus sur le partage de résumé des connaissances de la pile de technologie d'arrière-plan du serveur

Bienvenue à prêter attention à la communication et au progrès commun

Structure des données et algorithme] Explication facile à comprendre de la recherche dans l'arbre de recherche binaire

Codage

Le fermier de code a la bonne façon de vous fournir des articles techniques faciles à comprendre pour faciliter la technologie!

Je suppose que tu aimes

Origine blog.51cto.com/15006953/2552023
conseillé
Classement