On rappelle d'abord comment parcourir un arbre (qui est un graphe connexe, et sans cycle)
On utilise print
, mais celà pourrait être n'importe quelle action lors du parcours.
class Arbre: def __init__(self, racine, enfants): self.racine = racine self.enfants = enfants def parcours(arbre): """Parcours récursif d'un arbre, (parcours en profondeur). """ print(arbre.racine) for enfant in arbre.enfants: parcours(enfant) def parcours(arbre): """Parcours itératif d'un arbre en profondeur. On utilise une pile. """ pile = Pile() pile.empile(arbre) while not pile.est_vide(): noeud = pile.dépile() print(noeud.racine) for enfant in noeud.enfants: pile.empile(enfant) def parcours(arbre): """Parcours itératif d'un arbre en largeur. On utilise une file, et un code similaire !!! """ pile = File() pile.enfile(arbre) while not file.est_vide(): noeud = pile.défile() print(noeud.racine) for enfant in noeud.enfants: pile.enfile(enfant)
Exercice : Vérifier sur un arbre écrit à la main que les parcours proposés sont bons.
Exercice :
# Exemple de graphe d'ordre n, où # les sommets sont numérotés de 0 inclus à n exclu. def parcours(sommet_départ): """Parcours itératif d'un graphe, parcours en profondeur, en partant de 'sommet', uniquement de sa composante connexe. """ visité = [False for _ in range(n)] pile = Pile() pile.empile(sommet_départ) visité[sommet_départ] = True while not pile.est_vide(): sommet = pile.dépile() print(sommet) # ou autre action for enfant in sommet.enfants: if visité[enfant] == False: visité[enfant] = True pile.empile(enfant)
Exercice :
sommet_départ
.sommet_départ
et sommet_destination
.