Vous êtes sur la page 1sur 5

CPGE-Agadir 18/03/2016

DEVOIR SURVEILLE N°2


INFORMATIQUE
MP-PSI
2H

N. B. : La qualité de la rédaction et la rigueur des raisonnements seront pris en compte dans la notation.

Exercice1 : Tri
Soit la fonction de tri suivante :

from copy import copy


def trier(t):
p=copy(t) #p est une copie de t
for i in range(len(p)):
for j in range(len(p)-i-1):
if (p[j+1]<p[j]):
p[j],p[j+1]=p[j+1],p[j]
print(i,j,p)

return p

#programme principal
exemple=[3,1,4,2]
resultat=trier(exemple)

1- De quelle version de méthode de tri s’agit-il ?


2- Quelles sont les informations affichées lors de son exécution?
3- Que contient la variable resultat après son exécution?
4- Que contient la variable exemple après son exécution?
5- Que se passe-t-il si nous remplaçons l’instruction p=copy(t) par l’instruction p=t ?
6- Quelle est sa complexité
7- Réécrire la fonction récursive trier qui utilise le même algorithme que la fonction trier du programme
Python ci-dessus sans afficher les valeurs intermédiaires. L’appel trier(s) sur une liste d’entiers s
doit donc renvoyer une liste d’entiers triée r qui contient les mêmes éléments que la liste s.

M.Gueroihi Page 1/5


Exercice2 : Arbres
Arbre binaire d’entiers
Un arbre binaire d’entiers a est une structure qui peut, soit être vide, soit être un nœud qui contient une
étiquette entière, un sous-arbre gauche et un sous-arbre droit qui sont tous deux des arbres binaires
d’entiers.
Exemples :

Implémentation en python
Un arbre binaire peut être représenté par une liste :
Un arbre vide : a = [ ]
Un arbre non vide : a = [ étiquette_racine, fils_Gauche , fils_Droit]
Exemple :
Le deuxième arbre de l’exemple ci-dessus est représenté par la liste :
A=[14,[ 11,[5,[],[]],[8,[],[]] ],[13,[9,[],[]],[4,[],[]]]]
Numérotation hiérarchique des nœuds d’un arbre binaire
La numérotation hiérarchique des nœuds d’un arbre binaire a consiste à associer à chaque nœud un numéro
compris entre 0 et n-1 (n nombre de nœuds) par un parcours en largeur partant de la racine (numéro 0) et en
parcourant chaque niveau de gauche à droite jusqu’au dernier nœud : le plus profond et le plus à droite
(numéro n-1|).
Dans les exemples suivants, le numéro de chaque nœud sera noté en-dessous de son étiquette.

 Question 1 :
Ecrire les fonctions de base vues au cours : vide(a) ; val(a) ;filsGauche(a) ; filsDroit(a)

M.Gueroihi Page 2/5


 Question2:
Ecrire une fonction parcourir(a) qui parcoure un arbre par niveau et retourne une liste simple contenant les
valeurs des nœuds parcourus :
Exemple :
>>>A=[14,[ 11,[5,[],[]],[8,[],[]] ],[13,[9,[],[]],[4,[],[]]]]
>>>parcourir(A)
[14, 11, 13, 5, 8, 9, 4]

Arbres binaires complets (ABC)


Un arbre binaire complet est un arbre binaire dont tous les niveaux sont complets, c’est-à-dire que tous les
nœuds d’un même niveau ont deux fils non vides sauf les nœuds du niveau le plus profond qui n’ont aucun fils
(c’est-à-dire deux fils vides).
Le deuxième arbre de l’exemple ci-dessus est complet.
 Question 3 :
Ecrire la fonction non récursive hauteur(a) qui retourne la
hauteur d’un arbre binaire complet.

 Question 4 :
Ecrire la fonction nombreNiveaux(a) qui retourne le nombre
de niveaux d’un arbre a.
Exemple :
>>> nombreNiveaux(a)
3
 Question 5 :
Ecrire la fonction indiceNiveau(n) qui retourne le numéro du nœud le plus à gauche d’un niveau n d’un
arbre binaire complet.
Aide : Liste retournée par la
fonction parcourir(a)
Indices 0 1 2 3 4 5 6
étiquettes 14 11 13 5 8 9 4

numéro niveaux : 0 1 2

Exemple : pour un arbre ayant 4 niveaux :


>>> for i in range(4) : print (i , indiceNiveau(i))
...
0 0
1 1
2 3
3 7
 Question 6 :
Ecrire la fonction indiceDernierNiveau(a): qui retourne l’indice du dernier niveau de l’arbre a :
Exemple :
>>> indiceDernierNiveau(A)
3

M.Gueroihi Page 3/5


 Question 7 :
Donner une expression qui permet de calculer le nombre de nœuds par niveau ;
Ecrire la fonction nombreNoeudNiveau(n) qui retourne le nombre de nœuds du niveau n d’un arbre binaire
complet.
Exemple :
>>> for i in range(4) : print (i , nombreNoeudNiveau(i))
...
0 1
1 2
2 4
3 8

 Question 8 :
Ecrire la fonction niveaux(a) qui affiche les numéros des niveaux et la liste des nœuds correspondants :
Exemple :
>>> niveaux(A)
0 : [14]
1 : [11, 13]
2 : [5, 8, 9, 4]

 Question 9 :
Ecrire la fonction estArbreComplet(a) qui retourne True si a est un arbre binaire complet, False sinon.

Arbres binaires parfait (ABP)


Un arbre binaire parfait est un arbre binaire dont tous les niveaux sont complets sauf le niveau le plus profond qui
peut être incomplet auquel cas ses nœuds sont alignés à gauche de l’arbre.
Le troisième et le quatrième arbre de l’exemple ci-dessus, sont parfaits. Le deuxième est également parfait car il
est complet.
L’arbre B ci-contre peut être représenté :
Par une liste : [racine, filsGauche, filsDroits]
B=[11,[ 5,[14,[],[]],[8,[],[]] ],[9,[13,[],[]],[]]]
Ou par une liste simple : B=[11, 5, 9, 14, 8, 13]
 Un élément d'indice i de la liste (0 à n (exclu)) est considéré
comme un nœud de l'arbre ;
 son fils gauche s'il existe se trouve à l'indice 2*i+1
 son fils droit s'il existe se trouve à l'indice 2*i+2.
Ce nœud est une feuille si 2*i+1 est supérieur ou égal à n.
 Question 10 :
Ecrire la fonction filsD(i) qui retourne l’indice du fils droit d’un nœud d’indice i.
 Question 11 :
Ecrire la fonction pere(i) qui retourne l’indice du père d’un nœud d’indice i.
 Question 12 :
Ecrire la fonction filsG(i) qui retourne l’indice du fils gauche d’un nœud d’indice i.

M.Gueroihi Page 4/5


Arbres binaires en tas
Un arbre en tas est un arbre binaire parfait tel que l’information contenue dans tout nœud est supérieure à
celle contenue dans ses fils.

Les deux arbres suivant sont en tas :

 Question 13 :

Ecrire la fonction estUnTas(T) qui retourne True si le tableau T est un tas, False sinon.

 Question 14 :
Si l’on désire ajouter le nœud ayant la valeur 5 au 2ème tas de l’exemple ci-dessus expliquer sans écrire de
programme comment le faire puis dessiner l’arbre après insertion et la liste correspondante .

M.Gueroihi Page 5/5

Vous aimerez peut-être aussi