Recherche…


Introduction

L'arbre binaire est un arbre que chaque nœud contient au maximum deux enfants. L'arbre de recherche binaire (BST) est un arbre binaire dont les éléments sont positionnés dans un ordre spécial. Dans chaque BST, toutes les valeurs (c'est-à-dire la clé) dans le sous-arbre gauche sont inférieures aux valeurs dans le sous-arbre droit.

Arbre de recherche binaire - Insertion (Python)

Ceci est une implémentation simple de l'insertion d'arbre de recherche binaire utilisant Python.

Un exemple est présenté ci-dessous:

entrer la description de l'image ici

Suivant l'extrait de code, chaque image montre la visualisation de l'exécution, ce qui facilite la visualisation de son fonctionnement.

class Node:
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.data = val

entrer la description de l'image ici

def insert(root, node):
    if root is None:
        root = node
    else:
        if root.data > node.data:
            if root.l_child is None:
                root.l_child = node
            else:
                insert(root.l_child, node)
        else:
            if root.r_child is None:
                root.r_child = node
            else:
                insert(root.r_child, node)

entrer la description de l'image ici

def in_order_print(root):
    if not root:
        return
    in_order_print(root.l_child)
    print root.data
    in_order_print(root.r_child)

entrer la description de l'image ici

def pre_order_print(root):
    if not root:
        return        
    print root.data
    pre_order_print(root.l_child)
    pre_order_print(root.r_child)    

entrer la description de l'image ici

Arbre de recherche binaire - Suppression (C ++)

Avant de commencer avec la suppression, je veux juste mettre quelques lumières sur ce qu'est un arbre de recherche binaire (BST). Chaque nœud dans un fichier BST peut avoir au maximum deux nœuds (enfant gauche et droit). Le sous-arbre gauche d'un nœud a un clé inférieure ou égale à la clé de son nœud parent. Le sous-arbre droit d'un nœud a une clé plus grande que la clé de son nœud parent.

Suppression d'un nœud dans une arborescence tout en conservant sa propriété d'arborescence de recherche binaire.

entrer la description de l'image ici

Il y a trois cas à prendre en compte lors de la suppression d'un nœud.

  • Cas 1: Le nœud à supprimer est le nœud feuille (nœud avec la valeur 22).
  • Cas 2: le nœud à supprimer a un enfant (nœud avec la valeur 26).
  • Cas 3: le nœud à supprimer comporte les deux enfants (nœud avec la valeur 49).

Explication des cas:

  1. Lorsque le nœud à supprimer est un nœud feuille, supprimez simplement le nœud et transmettez nullptr à son nœud parent.
  2. Lorsqu'un noeud à supprimer ne possède qu'un seul enfant, copiez la valeur enfant dans la valeur du noeud et supprimez le fils (converti en cas 1).
  3. Lorsqu'un nœud à supprimer possède deux enfants, le minimum de son sous-arbre droit peut être copié sur le nœud, puis la valeur minimale peut être supprimée du sous-arbre droit du nœud (converti en cas 2).

Remarque: Le minimum dans la sous-arborescence de droite peut avoir au maximum un enfant et cet enfant si c'est le cas si l'enfant de gauche signifie qu'il ne s'agit pas de la valeur minimale ou s'il ne suit pas la propriété BST.

La structure d'un nœud dans un arbre et le code pour la suppression:

struct node
{
    int data;
    node *left, *right;
};

node* delete_node(node *root, int data)
{
  if(root == nullptr) return root;
  else if(data < root->data) root->left  = delete_node(root->left, data);
  else if(data > root->data) root->right = delete_node(root->right, data);

  else
  {
    if(root->left == nullptr && root->right == nullptr) // Case 1
    {
      free(root);
      root = nullptr;
    }
    else if(root->left == nullptr)       // Case 2
    {
       node* temp = root;
       root= root->right;
       free(temp);
    }
    else if(root->right == nullptr)      // Case 2
    {
       node* temp = root;
       root = root->left;
       free(temp);
    }
    else                                 // Case 3
    {
       node* temp = root->right;

       while(temp->left != nullptr) temp = temp->left;

       root->data = temp->data;
       root->right = delete_node(root->right, temp->data);
    }
  }
  return root;
}

La complexité temporelle du code ci-dessus est O ( h ), où h est la hauteur de l'arbre.

Ancêtre commun le plus bas dans un BST

Considérons le BST:

entrer la description de l'image ici

Le plus petit ancêtre commun de 22 et 26 est de 24

Le plus petit ancêtre commun de 26 et 49 est de 46

Le plus petit ancêtre commun de 22 et 24 est de 24

La propriété d'arbre de recherche binaire peut être utilisée pour trouver l'ancêtre le plus bas des noeuds

Code Psuedo:

lowestCommonAncestor(root,node1, node2){

if(root == NULL)    
return NULL;



 else if(node1->data == root->data || node2->data== root->data)    
    return root;
    
    else if((node1->data <= root->data && node2->data > root->data)
              || (node2->data <= root->data && node1->data > root->data)){
        
             return root;
    }
    
    else if(root->data > max(node1->data,node2->data)){
            return lowestCommonAncestor(root->left, node1, node2);
    }
        
        else {
            return lowestCommonAncestor(root->right, node1, node2);
      }
        }

Arbre de recherche binaire - Python

class Node(object):
    def __init__(self, val):
        self.l_child = None
        self.r_child = None
        self.val = val


class BinarySearchTree(object):
    def insert(self, root, node):
        if root is None:
            return node

        if root.val < node.val:
            root.r_child = self.insert(root.r_child, node)
        else:
            root.l_child = self.insert(root.l_child, node)

        return root


    def in_order_place(self, root):
        if not root:
            return None
        else:
            self.in_order_place(root.l_child)
            print root.val
            self.in_order_place(root.r_child)

    def pre_order_place(self, root):
        if not root:
            return None
        else:
            print root.val
            self.pre_order_place(root.l_child)
            self.pre_order_place(root.r_child)

    def post_order_place(self, root):
        if not root:
            return None
        else:
            self.post_order_place(root.l_child)
            self.post_order_place(root.r_child)
            print root.val

"" "Créer un noeud différent et y insérer des données" ""

r = Node(3)
node = BinarySearchTree()
nodeList = [1, 8, 5, 12, 14, 6, 15, 7, 16, 8]

for nd in nodeList:
    node.insert(r, Node(nd))

print "------In order ---------"
print (node.in_order_place(r))
print "------Pre order ---------"
print (node.pre_order_place(r))
print "------Post order ---------"
print (node.post_order_place(r))


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow