Théorie des graphes

Supprimer un noeud de l'arbre binaire de recherche

Lorsque nous supprimons un noeud, trois possibilités se présentent.

Feuille

Le noeud à supprimer est une feuille, il est terminal et il suffit de le retirer de l'arbre.

Le noeud a un fils unique

Le nœud à supprimer n'a qu'un seul enfant, on relie son fils à son père et on supprime le nœud .

Le noeud à supprimer a deux enfants

L’élément à supprimer a deux fils : on le remplace par son successeur qui est toujours le minimum de ses descendants droits.

Notez que le prédécesseur peut également être utilisé (nœud de clé maximum dans le sous-arbre gauche du nœud).

class Noeud:
    def __init__(self, key):
        self.gauche = None
        self.droit = None
        self.val = key


def Successeur(noeud):
    courant = noeud
    while(courant.gauche is not None):
        courant = courant.gauche
    return courant


def Predecesseur(noeud):
    courant = noeud
    while(courant.droit is not None):
        courant = courant.droit
    return courant


def Supprimer(noeud, cle):
    if noeud is None:
        return

    # si cle est inférieure à la valeur du noeud, rechercher dans le sous-arbre gauche
    if cle < noeud.val:
        noeud.gauche = Supprimer(noeud.gauche, cle)

    # si cle est supérieure à la valeur du noeud, rechercher dans le sous-arbre droit
    elif(cle > noeud.val):
        noeud.droit = Supprimer(noeud.droit, cle)

    # sinon
    else:

        # noeud a un fils unique
        if noeud.gauche is None:
            temp = noeud.droit
            noeud = None
            return temp

        elif noeud.droit is None:
            temp = noeud.gauche
            noeud = None
            return temp

        # noeud a deux enfants
        succ = Successeur(noeud.droit)

        # le cas de prédécesseur
        # pred=Predecesseur(noeud.gauche)

        # remplacer la valeur du noeud à supprimer avec la valeur du successeur
        noeud.val = succ.val

        # supprimer le successeur
        noeud.droit = Supprimer(noeud.droit, succ.val)

        # le cas de prédecesseur
        #noeud.gauche = Supprimer(noeud.gauche, succ.val)

    return noeud


# parcours infixe
def infixe(noeud):
    if noeud == None:
        return
    if noeud.gauche != None:
        infixe(noeud.gauche)
    print(noeud.val)
    if noeud.droit != None:
        infixe(noeud.droit)


def inserer(noeud, val):
    if noeud is None:
        noeud = Noeud(val)
    else:
        if noeud.val < val:
            if noeud.droit is None:
                noeud.droit = Noeud(val)
            else:
                inserer(noeud.droit, val)
        else:
            if noeud.gauche is None:
                noeud.gauche = Noeud(val)
            else:
                inserer(noeud.gauche, val)


racine = Noeud(9)
inserer(racine, 5)
inserer(racine, 11)
inserer(racine, 3)
inserer(racine, 4)
inserer(racine, 7)
inserer(racine, 8)
inserer(racine, 6)

racine = Supprimer(racine, 5)
infixe(racine)

Partager ce cours avec tes amis :
Rédigé par Mostafa Sedoki
Professeur d'Informatique dans les CPGE

Cours Similaires :