Sujet n°25
Sujet original
Pour télécharger l'énoncé original, cliquer ici.
Exercice n°1
Écrire une fonction enumere
qui prend en paramètre une liste L
et renvoie un
dictionnaire d
dont les clés sont les éléments de L
avec pour valeur associée la liste des
indices de l’élément dans la liste L
.
Commentaires
Ici, le mot « liste » est à comprendre dans le sens
« liste Python » (c'est-à-dire tableau) plutôt que
dans le sens du type abstrait de données liste
étudié en Terminale.
Exemple
>>> enumere([1, 1, 2, 3, 2, 1])
{1: [0, 1, 5], 2: [2, 4], 3: [3]}
Une solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | def enumere(L):
"""
L - list
Sortie: dict, dictionnaire qui, à chaque élément de L,
associe le tableau des indice où trouver cet élément dans L
"""
d = dict()
for i in range(len(L)):
if L[i] in d.keys():
d[L[i]].append(i)
else:
d[L[i]] = [i]
return d
if __name__ == '__main__':
# Exemple de l'énoncé
print(enumere([1, 1, 2, 3, 2, 1]) == {1: [0, 1, 5], 2: [2, 4], 3: [3]})
# Exemples supplémentaires
print(enumere([1, 1, 0, 0, 0, 1, 1]) == {0: [2, 3, 4], 1: [0, 1, 5, 6]})
print(enumere([0, 1]) == {0: [0], 1: [1]})
print(enumere([1, 0]) == {0: [1], 1: [0]})
|
Exercice n°2
Un arbre binaire est implémenté par la classe Arbre
donnée ci-dessous.
Les attributs fg
et fd
prennent pour valeurs des instances de la classe Arbre
ou None
.
1
2
3
4
5
6
7
8
9
10
11
12 | class Arbre:
def __init__(self, etiquette):
self.v = etiquette
self.fg = None
self.fd = None
def parcours(arbre, liste):
if arbre != None:
parcours(arbre.fg, liste)
liste.append(arbre.v)
parcours(arbre.fd, liste)
return liste
|
La fonction récursive parcours
renvoie la liste des étiquettes des nœuds de l’arbre
implémenté par l’instance arbre
dans l’ordre du parcours en profondeur infixe à partir
d’une liste vide passée en argument.
Compléter le code de la fonction insere
qui insère un nœud d’étiquette cle
en feuille de
l’arbre implémenté par l’instance arbre
selon la spécification indiquée et de façon que
l’arbre ainsi complété soit encore un arbre binaire de recherche.
Tester ensuite ce code en utilisant la fonction parcours
et en insérant successivement
des nœuds d’étiquette 1, 4, 6 et 8 dans l’arbre binaire de recherche représenté ci-
dessous :

1
2
3
4
5
6
7
8
9
10
11
12
13
14 | def insere(arbre, cle):
""" arbre est une instance de la classe Arbre qui implémente
un arbre binaire de recherche.
"""
if ...:
if ...:
insere(arbre.fg, cle)
else:
arbre.fg = Arbre(cle)
else:
if ...:
insere(arbre.fd, cle)
else:
arbre.fd = Arbre(cle)
|
Commentaire sur le code original
Pour télécharger l'original du fichier à compléter,
cliquer ici.
Une solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 | class Arbre:
def __init__(self, etiquette):
self.v = etiquette
self.fg = None
self.fd = None
def parcours(arbre, liste):
if arbre != None:
parcours(arbre.fg, liste)
liste.append(arbre.v)
parcours(arbre.fd, liste)
return liste
def insere(arbre, cle):
""" arbre est une instance de la classe Arbre qui implémente
un arbre binaire de recherche.
"""
if cle < arbre.v:
if arbre.fg is not None:
insere(arbre.fg, cle)
else:
arbre.fg = Arbre(cle)
else:
if arbre.fd is not None:
insere(arbre.fd, cle)
else:
arbre.fd = Arbre(cle)
if __name__ == '__main__':
# Exemple de l'énoncé
a = Arbre(5)
a.fg = Arbre(2)
a.fg.fd = Arbre(3)
a.fd = Arbre(7)
insere(a, 1)
insere(a, 4)
insere(a, 6)
insere(a, 8)
print(parcours(a, []) == [1, 2, 3, 4, 5, 6, 7, 8])
# Exemple supplémentaire
a = Arbre(8)
a.fg = Arbre(2)
a.fg.fd = Arbre(6)
a.fd = Arbre(9)
for i in range(4, 15, 3):
insere(a, i)
print(parcours(a, []) == [2, 4, 6, 7, 8, 9, 10, 13])
|