Adloun

Problème — Plus proche ancêtre commun dans un ABR

Application directe du cours · niveau 3 (difficile) · NSI (terminale), chapitre 3 — Les arbres

Énoncé

Problème — Plus proche ancêtre commun dans un ABR.

Dans un ABR contenant deux valeurs a et b, écrire une fonction ancetre_commun(arbre, a, b) qui renvoie la valeur du plus proche ancêtre commun, c'est-à-dire le nœud le plus profond dont les sous-arbres (ou lui-même) contiennent à la fois a et b.

Corrigé

La propriété d'ordre simplifie beaucoup le problème. Si a et b sont tous deux inférieurs au nœud courant, leur ancêtre commun est dans le sous-arbre gauche ; s'ils sont tous deux supérieurs, il est à droite. Sinon (les deux valeurs encadrent le nœud courant, ou l'une vaut le nœud), le nœud courant est lui-même l'ancêtre commun cherché.


def ancetre_commun(arbre, a, b):
    noeud = arbre
    while noeud is not None:
        if a < noeud.valeur and b < noeud.valeur:
            noeud = noeud.gauche
        elif a > noeud.valeur and b > noeud.valeur:
            noeud = noeud.droit
        else:
            return noeud.valeur       # point de separation
    return None

On suit un unique chemin depuis la racine jusqu'au « point de séparation » où les deux valeurs divergent : le coût est , soit pour un arbre équilibré. Par exemple, dans l'ABR de l'exemple, l'ancêtre commun de 4 et 7 est 6, et celui de 1 et 13 est la racine 8.

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.