xxxxxxxxxx# Arbre binaire - liste de listes<img src="https://www.nsi-ljm.fr/images/abin1.PNG" width="400" height="400" />On représente l'arbre à l'aide d'un tableau de tableaux (pourrait choisir un tuple de tuples).<a href="https://www.nsi-ljm.fr/NSI-TLE/res/res_arbre_binaire_cours.pdf"> voir le cours ici </a>Le code Python ci-dessous, construit l’arbre On représente l'arbre à l'aide d'un tableau de tableaux (pourrait choisir un tuple de tuples).
Le code Python ci-dessous, construit l’arbre
xxxxxxxxxxdef noeud(nom, fg = None, fd = None) : return {'racine': nom, 'fg' : fg, 'fd': fd}# création des noeuds (chaque noeud est un dictionnaire)k = noeud('k')f = noeud('f')e = noeud('e', k, None)b = noeud('b', e, f)m = noeud('m')j = noeud('j', m, None)i = noeud('i')d = noeud('d', i, j)h = noeud('h')c = noeud('c', None, h)a = noeud('a', c, d)racine = noeud('r', a, b)# création de l'arbre (construction récursive)def construit(arbre) : if arbre == None : return [] else: return [arbre['racine'],construit(arbre['fg']),construit(arbre['fd'])]arbre1=construit(racine)print(arbre1)xxxxxxxxxx### Hauteur de l'arbre**Définitions**Hauteur d’un noeud : la hauteur(ou profondeur ou niveau ) d’un noeud X est égale au nombre d’arêtes qu’il faut parcourir à partir de la racine pour aller jusqu’au noeud X.La hauteur (ou profondeur) d’un arbre est égale à la profondeur du noeud le plus profond.Voici l'algorithme du calcul de la hauteur :<img src="https://www.nsi-ljm.fr/images/ab_hauteur.png" width="400px">**Écrire la fonction hauteur**Définitions
Hauteur d’un noeud : la hauteur(ou profondeur ou niveau ) d’un noeud X est égale au nombre d’arêtes qu’il faut parcourir à partir de la racine pour aller jusqu’au noeud X.
La hauteur (ou profondeur) d’un arbre est égale à la profondeur du noeud le plus profond.
Voici l'algorithme du calcul de la hauteur :
Écrire la fonction hauteur
xxxxxxxxxxdef hauteur(arbre): passxxxxxxxxxxdef hauteur(arbre): if arbre==[]: return -1 else: h1=1+hauteur(arbre[1]) h2=1+hauteur(arbre[2]) return max(h1,h2) print(hauteur(arbre1))xxxxxxxxxx# Les parcours## Le parcours en largeur<img src="https://www.nsi-ljm.fr/images/p_largeur.png" width="400px">L’idée est la suivante:On utilise une File.* On met l’arbre dans la file.* Puis tant que la file n’est pas vide: * On défile la file. * On récupère sa racine. * On enfile son fils gauche s’il existe. * On enfile son fils droit s’il existe. **Écrire la fonction parcours_largeur**
L’idée est la suivante: On utilise une File.
Écrire la fonction parcours_largeur
xxxxxxxxxx# la classe Fileclass File: ''' classe File création d'une instance File avec une liste ''' def __init__(self): "Initialisation d'une file vide" self.L=[] def vide(self): "teste si la file est vide" return self.L==[] def defiler(self): "défile" assert not self.vide(), "file vide" return self.L.pop(0) def enfiler(self,x): self.L.append(x)xxxxxxxxxxdef parcours_largeur(arbre): passxxxxxxxxxxdef parcours_largeur(arbre): f=File() liste=[] f.enfiler(arbre) while not f.vide(): tmp=f.defiler() liste.append(tmp[0]) #print(liste) if tmp[1]!=[]: f.enfiler(tmp[1]) if tmp[2]!=[]: f.enfiler(tmp[2]) return listeprint(parcours_largeur(arbre1))xxxxxxxxxx## Parcours en profondeur<img src="https://www.nsi-ljm.fr/images/p_profondeur.png" width="400px">Chaque sommet "est visité 3 fois" :### le parcours prefixe :Fonction parcours_prefixe(arbre)Données :arbre binaire * Si L’arbre n’est pas vide alors: * Afficher :La racine de l’arbre * parcours_prefixe(sous-arbre gauche) * parcours_prefixe(sous-arbre droit) ### le parcours infixe :Fonction parcours_infixe(arbre)Données :arbre binaire * Si L’arbre n’est pas vide alors: * parcours_infixe(sous-arbre gauche) * Afficher :La racine de l’arbre * parcours_infixe(sous-arbre droit) ### le parcours suffixe ou postfixe :Fonction parcours_postfixe(arbre)Données :arbre binaire * Si L’arbre n’est pas vide alors: * parcours_postfixe(sous-arbre gauche) * parcours_postfixe(sous-arbre droit) * Afficher :La racine de l’arbre **Écrire les 3 fonctions**
Chaque sommet "est visité 3 fois" :
Fonction parcours_prefixe(arbre) Données :arbre binaire
Fonction parcours_infixe(arbre) Données :arbre binaire
Fonction parcours_postfixe(arbre) Données :arbre binaire
Écrire les 3 fonctions
xxxxxxxxxxdef parcours_prefixe(arbre): passdef parcours_infixe(arbre): passdef parcours_postfixe(arbre): passxxxxxxxxxx# parcours prefixedef parcours_prefixe(arbre): if arbre!=[]: print(arbre[0],end=" , " ) parcours_prefixe(arbre[1]) parcours_prefixe(arbre[2])parcours_prefixe(arbre1)xxxxxxxxxx# parcours infixedef parcoursInfixe(arbre) : if(arbre != []) : parcoursInfixe(arbre[1]) print(arbre[0], end = ', ') parcoursInfixe(arbre[2])parcoursInfixe(arbre1)xxxxxxxxxx# parcours suffixe ou Postfixedef parcoursPostfixe(arbre) : if(arbre != []) : parcoursPostfixe(arbre[1]) parcoursPostfixe(arbre[2]) print(arbre[0], end = ', ')parcoursPostfixe(arbre1)xxxxxxxxxx## Évaluer une expression arithmétiqueL'expression $2+\dfrac{3}{4-7}$Se représente avec l'arbre :<img src="https://www.nsi-ljm.fr/NSI-TLE/res/media_expressnum.eWeb/res/image_abin3.png" width="300px">L'algorithme qui permet d'évaluer cette expressionn est :<img src="https://www.nsi-ljm.fr/NSI-TLE/res/media_expressnum.eWeb/res/image_algo_eval_express.png" width="300px">**Écrire la fonction evalue**L'expression $2+\dfrac{3}{4-7}$
Se représente avec l'arbre :
L'algorithme qui permet d'évaluer cette expressionn est :
Écrire la fonction evalue
xxxxxxxxxx##################################################################### Création de l'arbre #####################################################################sept=noeud(7,None,None)quatre=noeud(4,None,None)m = noeud('-',quatre,sept)trois = noeud(3,None,None)deux = noeud(2,None,None)d = noeud('/',trois,m)racine = noeud('+', deux, d)arbreexp=construit(racine)print(arbreexp)xxxxxxxxxxdef evalue(arbre): passxxxxxxxxxxdef evalue(arbre): if arbre[1]==[] and arbre[2]==[]: res=arbre[0] elif arbre[0]=='+': res= evalue(arbre[1])+evalue(arbre[2]) elif arbre[0]=='-': res= evalue(arbre[1])-evalue(arbre[2]) elif arbre[0]=='*': res= evalue(arbre[1])*evalue(arbre[2]) elif arbre[0]=='/': res= evalue(arbre[1])/evalue(arbre[2]) else: res=None return resprint(evalue(arbreexp))xxxxxxxxxx