Valeurs supérieures à une cible dans un ABR
On s'intéresse dans cet exercice à des arbres binaires de recherche (ABR) sans doublons. On fournit différentes fonctions permettant de travailler avec de tels arbres :
abr_vide: crée et renvoie un ABR vide ;est_vide: renvoie le booléen indiquant si l'ABR passé en argument est vide ou non ;sag: renvoie le sous-arbre gauche de l'arbre passé en argument. Provoque une erreur si celui-ci est vide ;valeur: renvoie la valeur portée par la racine de l'arbre passé en argument. Provoque une erreur si celui-ci est vide ;sad: renvoie le sous-arbre droit de l'arbre passé en argument. Provoque une erreur si celui-ci est vide ;insere: insèrexdans l'ABR passé en argument. L'arbre est directement modifié : la fonction ne renvoie rien. Les doublons sont ignorés ;infixe: renvoie la liste des valeurs rencontrées lors du parcours infixe de l'arbre passé en argument ;representation: renvoie une chaîne de caractère décrivant l'arbre. Cette chaîne est au format :∅si l'arbre est vide ;(sous-arbre gauche, valeur, sous-arbre droit)dans le cas contraire.
>>> abr = abr_vide()
>>> est_vide(abr)
True
>>> insere(abr, 2)
>>> insere(abr, 1)
>>> insere(abr, 3)
>>> est_vide(abr)
False
>>> representation(abr)
'((∅, 1, ∅), 2, (∅, 3, ∅))'
>>> infixe(abr)
[1, 2, 3]
Les fonctions utilisées
def abr_vide():
"""Renvoie un ABR vide"""
return [None, None, None]
def est_vide(a):
"""Détermine si l'ABR passé en argument est vide ou non"""
return a[1] is None
def sag(a):
"""Renvoie le sous-arbre gauche de a
Provoque une erreur si a est vide
"""
if est_vide(a):
raise ValueError("L'arbre est vide")
return a[0]
def valeur(a):
"""Renvoie la valeur portée par la racine de a
Provoque une erreur si a est vide
"""
if est_vide(a):
raise ValueError("L'arbre est vide")
return a[1]
def sad(a):
"""Renvoie le sous-arbre droit de a
Provoque une erreur si a est vide
"""
if est_vide(a):
raise ValueError("L'arbre est vide")
return a[2]
def insere(a, x):
"""Insère x dans l'ABR a qui est modifié en place"""
if est_vide(a):
a[0:3] = [abr_vide(), x, abr_vide()]
val = valeur(a)
if x < val:
insere(sag(a), x)
elif val < x:
insere(sad(a), x)
def infixe(a):
"""Renvoie la liste des valeurs rencontrées lors du parcours infixe de l'ABR"""
def aux(a):
if not est_vide(a):
aux(sag(a))
parcours.append(valeur(a))
aux(sad(a))
return parcours
parcours = []
return aux(a)
def representation(a):
def aux(a):
if est_vide(a):
return "∅"
return f"({aux(a[0])}, {a[1]}, {aux(a[2])})"
return aux(a)
Écrire la fonction plus_grand qui prend en paramètres un arbre binaire de recherche ne contenant que des nombres entiers abr et un entier k.
Cette fonction renvoie la liste triée des valeurs présentes dans l'arbre supérieures ou égales à k.
Il est possible de résoudre ce problème en effectuant un certain parcours de l'arbre et en ne retenant a posteriori que les valeurs intéressantes. Cette solution est néanmoins inefficace car elle est amenée à visiter des sous-arbres que l'on pourrait ignorer en étant astucieux.
Les tests de cet exercice vérifieront donc que la solution proposée est efficace. Cette efficacité est mesurée à l'aide du nombre de valeurs lues lors de la résolution.
Exemples
>>> abr = abr_vide()
>>> for x in (1, 2, 3, 4, 5):
... insere(abr, x)
>>> plus_grand(abr, 0)
[1, 2, 3, 4, 5]
>>> plus_grand(abr, 4)
[4, 5]
>>> plus_grand(abr, 6)
[]
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)