TD Arbres
TD Arbres
TD Arbres
TD : ARBRES BINAIRES
Exercice 1 : Arbre binaire
1. Ecrire une fonction nommée isbinary(tree) qui prend un arbre tree en argument et retourne True si
l'arbre est un arbre binaire et False sinon.
>>>isbinary([1,[2,[],[]],[3,[],[]]])
True
>>>isbinary([1,2,3])
False
>>>isbinary([1,[2,[20]],[3,[30]],[4,[40]]])
False
2. Ecrire la fonction checkmul(tree) qui prend un arbre tree en argument et vérifie si l'arbre respecte la
règle suivante et renvoie True (obéit à la règle) ou False sinon.
Règle : chaque nœud (à l'exception des feuilles) est égale au produit des valeurs de ses nœuds fils.
Remarque : chaque nœud contient un nombre et chaque nœud interne a exactement deux fils:
15 7 35 70
3 5 3 5 7 5 -7 -10
-5 -1 -5 -2
>>>checkmul(A) >>>checkmul(C)
True True
>>>checkmul(B) >>>checkmul(D)
False False
Exercice 2:
1) Dessinez l'arbre binaire de recherche obtenu à partir d'un arbre vide si on insère les valeurs 22, 25, 28, 30, 23, 20,
18, 9, 13, 5, 8, 11, 1, 16, 6 et 3 dans cet ordre.
2) Redessinez l'arbre de la question 1 après la suppression de la valeur 18, puis la valeur 5.
3) Dessinez sous forme d'arbres les étapes de construction du tas binaire max construit par insertions successives des
valeurs suivantes : 5, 13, 2, 25, 7, 17, 20, 8, 4 (utilisez l'opération de remontée pour reconstruire le Tas max)
Exercice 3:
1) Ecrire la fonction hauteur(A) qui retourne la hauteur de l'arbre binaire A passé en argument.
2) Ecrire une fonction complet(A), qui retourne True si un arbre binaire A est complet (c’est-à-dire que tous les
niveaux sont pleins), et False si non.
Remarque: Un arbre est complet si pour tous ses nœuds la hauteur du sous arbre droit est égale à la hauteur du sous
arbre gauche (se provoque par récurrence)
Exemple:
* - 𝐴 = ["+" , ["*", [4, [ ], [ ]], [3, [ ], [ ]]] , ["-", ["*", [2, [ ], [ ]], [7, [ ], [ ]]] , [5, [ ], [ ]]]]
2 7
1) Ecrire la fonction valide(A) qui teste si un arbre binaire A (sachant bien que cet arbre ne contenant que des
nombres et des opérateurs pas besoin de vérifier) représente bien une expression arithmétique valide. C’est-à-
dire :
Chaque nœud étiqueté par un opérateur doit avoir deux fils non vides
Les nombres ne doivent apparaitre que sur les feuilles de l'arbre
2) Ecrire une fonction affiche(A) qui permet d'afficher l'expression arithmétique associée à A dans son
écriture infixée complètement parenthèsée.
Exemple : L'expression arithmétique donnée en exemple sera imprimée : ((4*3)+((2*7)-5))
3) On suppose que l'arbre représente bien une expression valide, écrire une fonction récursive evaluer(A) qui
renvoie la valeur correspondante à l'expression arithmétique représentée par l'arbre A.
Exemple : pour l'arbre illustré par la figure, la fonction doit renvoyer 21.
Exercice 5:
On s'intéresse au problème suivant : étant donné un arbre et 2 nœuds dans cet arbre, quel est leur plus proche
ancêtre commun (un nœud précédent commun à ces deux nœuds et qui est le plus proche)
Exemple:
Le plus proche ancêtre commun des nœuds 5 et 10 est le nœud 2, car:
12 o Le chemin de la racine au nœud 1 est : 12, 2, 1
o Le chemin de la racine au nœud 10 est : 12, 2, 6, 10
2 14 o 12 et 2 sont des nœuds précédents communs à 1 et 10 mais 2 est le plus
proche (le plus profond)
1 6 17
On s'intéresse à des arbres binaires de recherche dont les nœuds sont étiquetés par
des entiers distincts, et qui sont implémentés sous forme d'une liste à 3 éléments :
5 16 20
10 [Racine, Sous Arbre Gauche, Sous Arbre Droit]
1) Ecrire une fonction récursive cheminABR(A, p, k) qui reçoit en paramètre un arbre binaire de recherche
A et une liste initialement vide p et un entier k et qui stocke le chemin depuis la racine de A vers le nœud k dans
la liste p. la fonction revoie True si le chemin existe et False sinon.
2) Ecrire une fonction PPAC(A, n1, n2) qui reçoit en paramètre un arbre binaire de recherche A et deux
nœuds n1 et n2 et qui permet de retourner le plus proche ancêtre commun de n1 et n2 s'il existe, et affiche un
message d'erreur sinon (si l'un des nœuds n1 et n2 n'existe pas dans l'arbre)