Vous êtes sur la page 1sur 9

TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections.

Ecole Royale Navale - CPGE


Page 1 de 9 MP - Informatique

TP 05 Les arbres binaires de recherche (ABR)


Corrections proposées
Gossoni Mohamed
mohamedgossoni@gmail.com
L’Ecole Royale Navale - CPGE - 2ème année MP
Objectif:

Dans ce TP on implémentera les différents algorithmes étudiés au cours et qui manipulent les 𝐴𝐵𝑅s
via les opérations:
• Validation de la structure.
• Recherche:
– Appartenance.
– Max et Min.

• Modification:
– Insertion.

– Suppression.
• Tri:
– Tri d’une liste par l’utilisation d’un 𝐴𝐵𝑅.

1
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 2 de 9 MP - Informatique
On considère l’arbre binaire de recherche 𝐴 suivant

Et la représentation en Python de 𝐴 et d’un arbre binaire 𝐵 (n’est pas de recherche):

[1]: A=[25,
[10,
[5,[],[9,[],[]]],
[15,[12,[],[]],[]]],
[30,
[25,[],[28,[],[]]],
[35,[33,[],[]],[37,[36,[],[]],[]]]
]
]

B=[25,
[10,
[5,[],[9,[],[]]],
[15,[12,[],[]],[]]],
[30,
[25,[],[28,[],[]]],
[35,[38,[],[]],[37,[36,[],[]],[]]]
]
]

0.1 1) Un test d’ABR:


0.1.1 Exercice 1
• Ecrire 𝑒𝑠𝑡𝐴𝐵𝑅(𝐴) la fonction récursive qui teste si l’arbre binaire 𝐴 est de recherche ou non.
– Exemple:
∗ 𝑖𝑛 >:𝑙𝑖𝑠𝑡(𝑚𝑎𝑝(𝑒𝑠𝑡𝐴𝐵𝑅, [𝐴, 𝐵]))
∗ 𝑜𝑢𝑡 >:[𝑇 𝑟𝑢𝑒, 𝐹 𝑎𝑙𝑠𝑒]

2
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 3 de 9 MP - Informatique

Réponse:
[2]: def estABR(A):
if A==[]:
return True
if A[1]!=[] and A[1][0]>A[0]:
return False
if A[2]!=[] and A[2][0]<A[0]:
return False
return estABR(A[1]) and estABR(A[2])

list(map(estABR, [A, B]))

[2]: [True, False]

0.1.2 Exercice 2
• Ecrire 𝑒𝑠𝑡𝐴𝐵𝑅2(𝐴) la fonction qui teste si l’arbre binaire 𝐴 est de recherche ou non en
utilisant la liste du parcours infixé de 𝐴.
– Exemple:
∗ 𝑖𝑛 >:𝑙𝑖𝑠𝑡(𝑚𝑎𝑝(𝑒𝑠𝑡𝐴𝐵𝑅, [𝐴, 𝐵]))
∗ 𝑜𝑢𝑡 >:[𝑇 𝑟𝑢𝑒, 𝐹 𝑎𝑙𝑠𝑒]

[3]: def parcoursInfixe(A):


if A==[]:
return []
return parcoursInfixe(A[1])+[A[0]]+parcoursInfixe(A[2])

def estABR2(A):
if A==[]:
return True
L=parcoursInfixe(A)
for i in range(len(L)-1):
if L[i+1]<L[i]:
return False
return True

list(map(estABR2, [A, B]))

[3]: [True, False]

0.2 2) Opérations de recherche:


0.2.1 Exercice 3
1. Écrire 𝑒𝑥𝑖𝑠𝑡𝑅𝑒𝑐(𝐴, 𝑥), une fonction récursive décidant s’il existe ou non un nœud de valeur
𝑥 dans l’ABR 𝐴.
• Exemple:
– 𝑖𝑛 >: 𝑙𝑖𝑠𝑡(𝑚𝑎𝑝(𝑒𝑥𝑖𝑠𝑡𝑅𝑒𝑐, [𝐴, 𝐴], [28, 0]))
– 𝑜𝑢𝑡 >: [𝑇 𝑟𝑢𝑒, 𝐹 𝑎𝑙𝑠𝑒]

3
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 4 de 9 MP - Informatique

2. Écrire 𝑒𝑥𝑖𝑠𝑡𝐼𝑡(𝐴, 𝑥) la version itérative de 𝑒𝑥𝑖𝑠𝑡𝑅𝑒𝑐(𝐴, 𝑥).

Réponse:
[4]: def existRec(A,x):
if A==[]:
return False
if A[0]==x:
return True
if A[0]>x:
return existRec(A[1],x)
if A[0]<x:
return existRec(A[2],x)

list(map(existRec, [A, A],[28,0]))

[4]: [True, False]

[5]: def existIt(A,x):


while A!=[]:
if A[0]==x:
return True
if A[0]>x:
A=A[1]
else:
A=A[2]
return False

list(map(existIt, [A, A],[28,0]))

[5]: [True, False]

0.2.2 Exercice 4
1. Écrire 𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑖𝑛𝑅𝑒𝑐(𝐴), (et 𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑎𝑥𝑅𝑒𝑐(𝐴)) une fonction récursive qui retourne
la valeur max (min) d’un ABR 𝐴.
• Exemple:
– 𝑖𝑛 >:𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑖𝑛𝑅𝑒𝑐(𝐴)
– 𝑜𝑢𝑡 >:5
– 𝑖𝑛 >:𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑎𝑥𝐼𝑡(𝐴)
– 𝑜𝑢𝑡 >:37
2. Écrire 𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑖𝑛𝐼𝑡 et 𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑎𝑥𝐼𝑡 les versions itératives de 𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑖𝑛𝑅𝑒𝑐 et
𝑟𝑒𝑐ℎ𝑒𝑟𝑐ℎ𝑒𝑀 𝑎𝑥𝑅𝑒𝑐.

Réponse:
[6]: def rechercheMinRec(A):
if A==[]:
return None

4
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 5 de 9 MP - Informatique

if A[1]==[]:
return A[0]
return rechercheMinRec(A[1])

def rechercheMaxRec(A):
if A==[]:
return None
if A[2]==[]:
return A[0]
return rechercheMaxRec(A[2])

[7]: def rechercheMinIt(A):


while A!=[]:
if A[1]==[]:
return A[0]
A=A[1]
return None

def rechercheMaxIt(A):
while A!=[]:
if A[2]==[]:
return A[0]
A=A[2]
return None

[8]: print('min =',rechercheMinRec(A),'et max =',rechercheMaxIt(A))

min = 5 et max = 37

0.3 3) Opérations de modification:


0.3.1 Exercice 5
1. Écrire une fonction récursive 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛𝑅𝑒𝑐(𝐴, 𝑣) qui modifie 𝐴 en y insérant un nœud de
valeur 𝑣 tout en présérvant la structure ABR.
Exemple: > 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛𝑅𝑒𝑐(𝐴, 29)
> 𝐴 = [25, [10, [5, [], [9, [], []]], [15, [12, [], []], []]], [30, [25, [], [28, [], [29, [], []]]], [35, [33, [], []], [37, [36, [], []], []]]]]
2. Écrire 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛𝐼𝑡(𝐴, 𝑣) la version itérative de la fonction 𝑖𝑛𝑠𝑒𝑟𝑡𝑖𝑜𝑛𝑅𝑒𝑐(𝐴, 𝑣).

Réponse:
[9]: def insertionRec(A,v):
if A==[]:
A.extend([v,[],[]])
elif v<=A[0]:
return insertionRec(A[1],v)
else:
return insertionRec(A[2],v)

5
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 6 de 9 MP - Informatique

[10]: insertionRec(A,29)
A

[10]: [25,
[10, [5, [], [9, [], []]], [15, [12, [], []], []]],
[30,
[25, [], [28, [], [29, [], []]]],
[35, [33, [], []], [37, [36, [], []], []]]]]

[11]: def insertionIt(A,v):


if A==[]:
A.extend([v,[],[]])
return A
Bool=True
while Bool:
if v<=A[0]:
if A[1]==[]:
A[1].extend([v,[],[]])
Bool=False
else:
A=A[1]
else:
if A[2]==[]:
A[2].extend([v,[],[]])
Bool=False
else:
A=A[2]

[12]: insertionIt(A,30)
A

[12]: [25,
[10, [5, [], [9, [], []]], [15, [12, [], []], []]],
[30,
[25, [], [28, [], [29, [], [30, [], []]]]],
[35, [33, [], []], [37, [36, [], []], []]]]]

0.3.2 Exercice 6
1. Écrire une fonction récursive 𝑠𝑢𝑝𝑝𝑟𝑖𝑚𝑒𝑟𝑅𝑒𝑐(𝐴, 𝑣) qui supprime un nœud de valeur 𝑣 dans 𝐴
tout en préservant la structure ABR.
• Exemple:
– 𝑖𝑛 >: 𝑠𝑢𝑝𝑝𝑟𝑖𝑚𝑒𝑟𝑅𝑒𝑐(𝐴, 37)
– 𝑖𝑛 >: 𝐴
– 𝑜𝑢𝑡 >: [25, [10, [5, [], [9, [], []]], [15, [12, [], []], []]], [30, [25, [], [28, [], []]], [35, [33, [], []], [36, [], []]]]]
2. Écrire 𝑠𝑢𝑝𝑝𝑟𝑖𝑚𝑒𝑟𝐼𝑡(𝐴, 𝑣) la version itérative de la fonction 𝑠𝑢𝑝𝑝𝑟𝑖𝑚𝑒𝑟𝐼𝑡(𝐴, 𝑣).

6
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 7 de 9 MP - Informatique

Réponse:
[13]: def supprimerRec(A,v):
if A!=[]:
if v<A[0]:
supprimerRec(A[1],v)
elif v>A[0]:
supprimerRec(A[2],v)
else:
if A[1]==[] and A[2]==[]:
del(A[:])
elif A[1]==[]:
A[0]=A[2][0]
supprimerRec(A[2],A[2][0])
elif A[2]==[]:
A[0]=A[1][0]
supprimerRec(A[1],A[1][0])
else:
v=rechercheMinIt(A[2])
A[0]=v
supprimerRec(A[2],v)

[14]: supprimerRec(A,37)
A

[14]: [25,
[10, [5, [], [9, [], []]], [15, [12, [], []], []]],
[30,
[25, [], [28, [], [29, [], [30, [], []]]]],
[35, [33, [], []], [36, [], []]]]]

[15]: def supprimerIt(A,v):


while A!=[]:
if v<A[0]:
A=A[1]
elif v>A[0]:
A=A[2]
else:
if A[1]==[] and A[2]==[]:
del(A[:])
elif A[1]==[]:
v=A[2][0]
A[0]=v
A=A[2]
elif A[2]==[]:
v=A[1][0]
A[0]=v
A=A[1]

7
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 8 de 9 MP - Informatique

else:
v=rechercheMinIt(A[2])
A[0]=v
A=A[2]

[16]: supprimerIt(A,30)
A

[16]: [25,
[10, [5, [], [9, [], []]], [15, [12, [], []], []]],
[33, [25, [], [28, [], [29, [], [30, [], []]]]], [35, [], [36, [], []]]]]

0.4 4) Opérations de tri:


0.4.1 Exercice 7
• Écrire 𝑖𝑛𝑠𝑒𝑟𝑡𝑆𝑢𝑐𝑐(𝐿) la fonction qui construit un ABR par insertions successives d’éléments
de la liste 𝐿.
– Exemple:
∗ 𝑖𝑛 >: 𝐿 = [4, 8, 2, 7, 3, 6, 1, 5, 0, 9]
∗ 𝑖𝑛 >: 𝑖𝑛𝑠𝑒𝑟𝑡𝑆𝑢𝑐𝑐(𝐿)
∗ 𝑜𝑢𝑡 >: [4, [2, [1, [0, [], []], []], [3, [], []]], [8, [7, [6, [5, [], []], []], []], [9, [], []]]]

Réponse:
[17]: def insertSucc(L):
A=[]
n=len(L)
for i in range(n):
insertionIt(A,L[i])
return A

[18]: L=[4,8,2,7,3,6,1,5,0,9]
insertSucc(L)

[18]: [4,
[2, [1, [0, [], []], []], [3, [], []]],
[8, [7, [6, [5, [], []], []], []], [9, [], []]]]

0.4.2 Exercice 8
• Écrire 𝑝𝑎𝑟𝑐𝑜𝑢𝑟𝑠𝐼𝑛𝑓𝑖𝑥𝑒(𝐴) qui retourne la liste du parcours infixe de l’ABR 𝐴, puis à l’aide
de 𝑖𝑛𝑠𝑒𝑟𝑡𝑆𝑢𝑐𝑐(𝐿) et 𝑝𝑎𝑟𝑐𝑜𝑢𝑟𝑠𝐼𝑛𝑓𝑖𝑥𝑒(𝐴), écrire 𝑡𝑟𝑖𝐴𝐵𝑅(𝐿) la fonction qui retourne la liste
triée (ordre croissant) de la liste 𝐿.
– Exemple:
∗ 𝑖𝑛 >: 𝐿 = [4, 8, 2, 7, 3, 6, 1, 5, 0, 9]
∗ 𝑖𝑛 >: 𝑡𝑟𝑖𝐴𝐵𝑅(𝐿)
∗ 𝑜𝑢𝑡 >: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

8
TP05 Les arbres - Arbre binaire de recherche (ABR) - Corrections. Ecole Royale Navale - CPGE
Page 9 de 9 MP - Informatique

Réponse:
[19]: def triABR(L):
A=insertSucc(L)
return parcoursInfixe(A)

[20]: L=[4,8,2,7,3,6,1,5,0,9]
triABR(L)

[20]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Vous aimerez peut-être aussi