2010-04-05 15 views
17

Quelqu'un a-t-il une implémentation prête de l'algorithme de traversée en avant de C#?Inverser la largeur Première traversée en C#

Inverser la largeur Première traversée, je veux dire au lieu de chercher un arbre à partir d'un nœud commun, je veux rechercher l'arbre à partir du bas et converger graduellement vers un nœud commun.

Voyons voir la figure ci-dessous, c'est la sortie d'une largeur d'abord traversal: alt text

Dans mon largeur inverse premier traversal, 9, 10, 11 et 12 seront les premiers noeuds trouvés (l'ordre d'entre eux ne sont pas importants car ils sont tous de premier ordre). 5, 6, 7 et 8 sont les deuxièmes quelques nœuds trouvés, et ainsi de suite. 1 serait le dernier noeud trouvé.

Des idées ou des pointeurs?

Edit: Modifier « Largeur de recherche d'abord » à « Polyvalence Première traversal » pour clarifier la question

+2

Comment trouvez-vous toutes les feuilles sans traverser l'arbre entier? – Nifle

+1

Non sans en savoir plus sur le problème. Il est normalement possible de débuter avec un nœud et un éventail, comme dans la recherche en largeur, la recherche en profondeur, l'approfondissement itératif, etc. Comment devons-nous savoir a priori que 9, 10, 11 et 12 sont trois sauts 1? –

+0

Qu'avez-vous utilisé pour faire cette image? –

Répondre

7

Exécuter un BFS normal de rootNode et laisser depth[i] = linked list of nodes with depth i. Donc, pour votre exemple, vous aurez:

depth[1] = {1}, depth[2] = {2, 3, 4} etc.. Vous pouvez le construire avec une simple recherche BFS. Ensuite, imprimez tous les nœuds dans depth[maxDepth], puis ceux depth[maxDepth - 1] etc.

La profondeur d'un nœud i est égale à la profondeur de son noeud père + 1. peut être considéré comme la profondeur du nœud racine 1 ou 0.

16

Utilisez une combinaison d'une pile et file d'attente. Faites le BFS 'normal' en utilisant la file d'attente (ce que je suppose que vous savez déjà faire), et continuez à pousser les noeuds sur la pile quand vous les rencontrez. Une fois terminé avec le BFS, la pile contiendra l'ordre inverse du BFS.