diff --git a/arbre.py b/arbre.py deleted file mode 100644 index b5efbbf..0000000 --- a/arbre.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Sat Jan 23 19:23:01 2021 - -@author: manu -""" - -from File import File_chaine as File -from Pile import Pile_chaine as Pile - - -class Arbre: - """Un arbre binaire.""" - def __init__(self, val): - self.valeur = val - self.gauche = None - self.droit = None - - def insere_gauche(self, val): - """Insère la valeur val à la racine du fils gauche de l'arbre. - L'ancien fils gauche devient le fils gauche du nouveau nœud. - Renvoie le sous arbre créé.""" - nouvel_arbre = Arbre(val) - nouvel_arbre.gauche = self.gauche - self.gauche = nouvel_arbre - return nouvel_arbre - - def insere_droit(self, val): - """Insère la valeur val à la racine du fils droit de l'arbre. - L'ancien fils droit devient le fils gauche du nouveau nœud. - Renvoie le sous arbre créé.""" - nouvel_arbre = Arbre(val) - nouvel_arbre.gauche = self.droit - self.droit = nouvel_arbre - return nouvel_arbre - - -def taille(a): - """Renvoie la taille de l'arbre a.""" - if a is None: - return 0 - return 1 + taille(a.gauche) + taille(a.droit) - - -def hauteur(a): - """Renvoie la hauteur de l'arbre a.""" - if a is None: - return 0 - return 1 + max(hauteur(a.gauche), hauteur(a.droit)) - - -def parcours_bfs(a): - """Affiche tous les nœuds de l'arbre non vide a par un parcours BFS.""" - a_traiter = File() - a_traiter.enfiler(a) - while not a_traiter.est_vide(): - noeud = a_traiter.defiler() - print(noeud.valeur) - if noeud.gauche is not None: - a_traiter.enfiler(noeud.gauche) - if noeud.droit is not None: - a_traiter.enfiler(noeud.droit) - - -def parcours_dfs_iter(a): - """Affiche tous les nœuds de l'arbre non vide a par un parcours DFS.""" - a_traiter = Pile() - a_traiter.empiler(a) - while not a_traiter.est_vide(): - noeud = a_traiter.depiler() - print(noeud.valeur) - if noeud.droit is not None: - a_traiter.empiler(noeud.droit) - if noeud.gauche is not None: - a_traiter.empiler(noeud.gauche) - - -def parcours_dfs_prefixe(a): - """Affiche tous les nœuds de l'arbre a par un parcours DFS préfixé.""" - if a is None: - return - print(a.valeur) - parcours_dfs_prefixe(a.gauche) - parcours_dfs_prefixe(a.droit) - - -def parcours_dfs_infixe(a): - """Affiche tous les nœuds de l'arbre a par un parcours DFS préfixé.""" - if a is None: - return - parcours_dfs_infixe(a.gauche) - print(a.valeur) - parcours_dfs_infixe(a.droit) - - -def parcours_dfs_postfixe(a): - """Affiche tous les nœuds de l'arbre a par un parcours DFS préfixé.""" - if a is None: - return - parcours_dfs_postfixe(a.gauche) - parcours_dfs_postfixe(a.droit) - print(a.valeur) - - -if __name__ == "__main__": - a = Arbre("A") - a.insere_gauche("B") - a.insere_droit("C") - a.gauche.insere_gauche("D") - a.gauche.insere_droit("E") - a.gauche.gauche.insere_droit("G") - a.droit.insere_gauche("F") diff --git a/listeChaine.py b/listeChaine.py new file mode 100644 index 0000000..5c491ef --- /dev/null +++ b/listeChaine.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Sep 22 20:44:35 2020 + +@author: manu +""" + + +class Maillon: + """Un maillon d'une liste chaînée.""" + def __init__(self, valeur, suivant): + self.valeur = valeur + self.suivant = suivant + + def __str__(self): + """Renvoie une chane de caractères représentant le maillon.""" + return str(self.valeur) + + +class ListeChaine: + """Une liste chaînée.""" + def __init__(self, tete=None): + """Crée une liste vide, ou une liste dont la tete (un maillon) + est donnée.""" + self.__tete = tete + + def est_vide(self): + """Indique si la liste est vide.""" + return self.__tete is None + + def tete(self): + """Renvoie la valeur du premier élément de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de tête") + return self.__tete.valeur + + def queue(self): + """Renvoie la queue de la liste.""" + if self.est_vide(): + raise IndexError("La liste vide n'a pas de queue") + return ListeChaine(self.__tete.suivant) + + def ajoute(self, valeur): + """ajoute `valeur` en tête de la liste.""" + self.__tete = Maillon(valeur, self.__tete) + + def __str__(self): + """Renvoie une chaîne de caractères représentant la liste.""" + maillon = self.__tete + s = '' + while maillon is not None: + s = s + str(maillon.valeur) + maillon = maillon.suivant + if maillon is not None: + s += '->' + return s + + def __len__(self): + """Renvoie la longueur de la liste.""" + maillon = self.__tete + long = 0 + while maillon is not None: + long = long + 1 + maillon = maillon.suivant + return long + + def __getitem__(self, n): + """Renvoie l'élément d'indice n de la liste.""" + maillon = self.__tete + i = 0 + while i < n and maillon is not None: + i = i + 1 + maillon = maillon.suivant + if maillon is None or n < 0: + raise IndexError("Indice non valide") + return maillon.valeur + + def __add__(self, other): + """Renvoie la liste correspondant à la concaténation des 2 listes.""" + if self.est_vide(): + return other + v = self.tete() + q = self.queue() + return ListeChaine(Maillon(v, (q + other).__tete)) + + def reverse(self): + """Renvoie une liste correspondant à la liste renversée.""" + res = ListeChaine() + maillon = self.__tete + while maillon is not None: + res.ajoute(maillon.valeur) + maillon = maillon.suivant + return res + + +if __name__ == "__main__": + lst = ListeChaine() + print(lst.est_vide()) + lst.ajoute(306) + lst.ajoute(42) + lst.ajoute(205) + print(lst) + print(lst.est_vide()) + print(lst[0]) + print(lst[1]) + print(len(lst)) + lst2 = ListeChaine() + lst2.ajoute(18) + lst2.ajoute(45) + print(lst + lst2)