soit un nœud, contenant une clé et deux sous-arbres gauche et droit et représenté par un triplet (valeur, sag, sad) où valeur est la clé, et sag et sad sont les sous-arbres gauche et droit.
Exemple
graph
a((4)) --- b((1))
b --- d((0))
b --- n5((3))
a --- c((5))
c --- e((" "))
c --- n3((6))
style e fill:none,stroke:none,color:none
Ainsi, l’arbre binaire ci-dessus est créé par le code python suivant :
On souhaite écrire la fonction est_abr qui prend en paramètre un arbre binaire arbre, et renvoie True si l'arbre est un arbre binaire de recherche (avec les éventuels doublons à droite) et False sinon.
L'implémentation doit être optimale et le comportement doit donc être linéaire en nombre de valeurs dans l'arbre, \(O(N)\).
Indices logiques
La valeur portée par la racine constitue une limite pour les valeurs envisageables pour ses deux enfants.
Indice 2
Imaginons que l'on sache que la racine en cours peut prendre n'importe quelle valeur comprise entre \(L\) et \(R\).
Si on nomme \(V\) la valeur de la racine, que peut-on dire de l'intervalle des valeurs possibles pour l'enfant de gauche ? Et lm'enfant droit ?
Indice 3
Ne pas oublier qu'il peut y avoir des doublons ! Sur la droite !
Indice 4
Un des problèmes essentiels à résoudre est de trouver comment "démarrer".
Quelles sont les valeurs possibles au tout début, lorsqu'on est sur la racine de l'arbre passé en argument à la fonction est_abr ?
Indice 5
... Il y en a une infinité !
Indices techniques
Lors d'un appel de fonction, il sera nécessaire d'avoir des informations en plus de l'arbre lui-même. Il peut donc être intéressant de travailler avec une fonction auxiliaire, ou même mieux, une sous fonction. Cette fonction accepterait des arguments en plus de l'arbre à valider : autant que nécessaire pour répondre à la question.
Indice B
Pour chaque appel, il faut savoir quel est l'arbre à valider, et aussi quelle sont les bornes actuellement valides.
Indice C
Le module math contient différentes fonctions... Et constantes...
Comme par exemple, inf.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)