Adloun

Problème — Suppression d'une valeur dans un ABR

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 3 — Les arbres

Énoncé

Problème — Suppression d'une valeur dans un ABR.

La suppression dans un ABR est l'opération la plus délicate, car retirer un nœud ne doit pas casser la propriété d'ordre. Écrire une fonction supprimer(arbre, x) qui supprime la valeur x d'un ABR et renvoie la racine de l'arbre modifié.

Corrigé

On localise d'abord le nœud à supprimer comme pour une recherche. Trois cas se présentent une fois trouvé :


def min_valeur(arbre):
    # plus petite valeur d'un ABR : le noeud le plus a gauche
    while arbre.gauche is not None:
        arbre = arbre.gauche
    return arbre.valeur

def supprimer(arbre, x):
    if arbre is None:
        return None
    if x < arbre.valeur:
        arbre.gauche = supprimer(arbre.gauche, x)
    elif x > arbre.valeur:
        arbre.droit = supprimer(arbre.droit, x)
    else:
        # noeud trouve : on traite les trois cas
        if arbre.gauche is None:
            return arbre.droit        # 0 ou 1 enfant (a droite)
        if arbre.droit is None:
            return arbre.gauche       # 1 enfant (a gauche)
        # deux enfants : on prend le successeur
        succ = min_valeur(arbre.droit)
        arbre.valeur = succ
        arbre.droit = supprimer(arbre.droit, succ)
    return arbre

Dans le cas à deux enfants, le successeur est la plus petite valeur du sous-arbre droit : c'est la seule valeur qui peut prendre la place du nœud supprimé tout en conservant la propriété d'ordre (toutes les valeurs à gauche lui restent inférieures, toutes celles à droite supérieures). La suppression a un coût de , soit pour un arbre équilibré.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.