Adloun

Problème — Dictionnaire ordonné par ABR

Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 9 — La programmation orientée objet

Énoncé

Problème — Dictionnaire ordonné par ABR.

On veut associer des clés (entiers) à des valeurs, tout en pouvant parcourir les clés dans l'ordre croissant. Implémenter une classe Dictionnaire fondée sur un arbre binaire de recherche, avec les méthodes inserer(cle, valeur), rechercher(cle) et cles_triees().

Corrigé

On enrichit le nœud d'une valeur associée à la clé. La structure d'ABR sur les clés garantit que le parcours infixe les restitue triées.


class NoeudDico:
    def __init__(self, cle, valeur):
        self.cle = cle
        self.valeur = valeur
        self.gauche = None
        self.droit = None

class Dictionnaire:
    def __init__(self):
        self.racine = None

    def inserer(self, cle, valeur):
        self.racine = self._inserer(self.racine, cle, valeur)

    def _inserer(self, noeud, cle, valeur):
        if noeud is None:
            return NoeudDico(cle, valeur)
        if cle < noeud.cle:
            noeud.gauche = self._inserer(noeud.gauche, cle, valeur)
        elif cle > noeud.cle:
            noeud.droit = self._inserer(noeud.droit, cle, valeur)
        else:
            noeud.valeur = valeur     # mise a jour
        return noeud

    def rechercher(self, cle):
        noeud = self.racine
        while noeud is not None:
            if cle == noeud.cle:
                return noeud.valeur
            noeud = noeud.gauche if cle < noeud.cle else noeud.droit
        return None

    def cles_triees(self):
        acc = []
        self._infixe(self.racine, acc)
        return acc

    def _infixe(self, noeud, acc):
        if noeud is not None:
            self._infixe(noeud.gauche, acc)
            acc.append(noeud.cle)
            self._infixe(noeud.droit, acc)

d = Dictionnaire()
d.inserer(3, "trois")
d.inserer(1, "un")
d.inserer(2, "deux")
print(d.rechercher(2))   # deux
print(d.cles_triees())   # [1, 2, 3]

La recherche s'effectue en moyenne en pour un arbre équilibré, contre pour une liste non triée.

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.