Adloun

NSI (terminale) · Chapitre 3 · Application directe du cours

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

Les arbres · niveau 3 (difficile)

É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.

100 % gratuit

Essaie le suivant avec le tuteur

Faire l'exercice suivant avec le tuteur

Sans compte : le cours, le premier QCM, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →