Dictionnaire des indices - Sujet 24 - EP NSI 2025
Énoncé du problème
Exercice 1
EXERCICE 1 (10 points)
Écrire une fonction enumere qui prend en paramètre un tableau tab (type list) et renvoie un dictionnaire d dont les clés sont les éléments de tab avec pour valeur associée la liste des indices de l’élément dans le tableau tab.
Exemple :
>>> enumere([])
{}
>>> enumere([1, 2, 3])
{1: [0], 2: [1], 3: [2]}
>>> enumere([1, 1, 2, 3, 2, 1])
{1: [0, 1, 5], 2: [2, 4], 3: [3]}
Exercice 2
EXERCICE 2 (10 points)
Un arbre binaire est soit vide, représenté en Python par la valeur None, soit un nœud, contenant une étiquette et deux sous-arbres gauche et droit représentés par une instance de la classe Noeud donnée ci-dessous.
class Noeud:
"""Classe représentant un noeud d'un arbre binaire"""
def __init__(self, etiquette, gauche, droit):
"""Crée un noeud de valeur etiquette avec
gauche et droit comme fils."""
self.etiquette = etiquette
self.gauche = gauche
self.droit = droit
def parcours(arbre, liste):
"""parcours récursivement l'arbre en ajoutant les étiquettes
de ses noeuds à la liste passée en argument en ordre infixe."""
if arbre != None:
parcours(arbre.gauche, liste)
liste.append(arbre.etiquette)
parcours(arbre.droit, 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, présenté page suivante, qui prend en argument un arbre binaire de recherche arbre représenté ainsi et une étiquette cle, non présente dans l’arbre, et qui :
- renvoie une nouvelle feuille d’étiquette
cles’il est vide ; - renvoie l’arbre après l’avoir modifié en insérant
clesinon ; - garantit 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 :
flowchart TD
n5((5)) --> n2((2))
n5 --> n7((7))
n2 --> n3((3))
[Figure : schéma d’un arbre binaire de recherche. La racine porte l’étiquette 5 ; son fils gauche porte l’étiquette 2 et son fils droit l’étiquette 7 ; le nœud d’étiquette 2 possède un unique fils, d’étiquette 3.]
def insere(arbre, cle):
"""insere la cle dans l'arbre binaire de recherche
représenté par arbre.
Retourne l'arbre modifié."""
if arbre == None:
return Noeud(cle, None, None) # creation d'une feuille
else:
if ...:
arbre.gauche = insere(arbre.gauche, cle)
else:
arbre.droit = ...
return arbre
Les contraintes ci-dessous sont ajoutées par la plateforme et ne font pas partie du sujet.
Exercice 1
Contraintes :
tabest de typelistet0 <= len(tab) <= 10^4- les éléments de
tabsont hachables : ils sont tous de typeintou tous de typestr - si les éléments sont des entiers :
-10^9 <= tab[i] <= 10^9 - si les éléments sont des chaînes :
1 <= len(tab[i]) <= 100 enumere([])renvoie le dictionnaire vide{}- pour chaque clé, la liste associée contient tous les indices de cet élément dans
tab, rangés par ordre croissant - l’ordre des clés du dictionnaire renvoyé n’est pas imposé
Exercice 2
Contraintes :
arbrevautNone(arbre vide) ou est une instance de la classeNoeudfournie, et c’est un arbre binaire de recherche- l’arbre contient au plus
200nœuds, et sa hauteur est donc au plus200 - les étiquettes sont des entiers deux à deux distincts, avec
-10^9 <= etiquette <= 10^9 cleest un entier vérifiant-10^9 <= cle <= 10^9et n’est pas déjà présente dans l’arbreinsererenvoie l’arbre binaire de recherche obtenu après insertion : une nouvelle feuille siarbreest vide, l’arbrearbremodifié sinon- la classe
Noeudet la fonctionparcourssont fournies et ne doivent pas être modifiées