2010-04-05 11 views
17

¿Alguien tiene una implementación lista del algoritmo transversal Reverse Breadth First en C#?Reverse Breadth Primera pasada en C#

Por Reverse Breadth Primer recorrido, quiero decir, en lugar de buscar un árbol a partir de un nodo común, quiero buscar el árbol desde la parte inferior y converger gradualmente a un nodo común.

Vamos a ver la figura de abajo, esto es la salida de una amplitud primer recorrido: alt text

En mi inversa amplitud primer recorrido, 9, 10, 11 y 12 serán los primeros nodos que se encuentran (el orden de ellos no son importantes ya que todos son de primer orden). 5, 6, 7 y 8 son los segundos nodos encontrados, y así sucesivamente. 1 sería el último nodo encontrado.

¿Alguna idea o sugerencia?

Editar: Cambiar "búsqueda en anchura" a "Amplitud primer recorrido" para aclarar la cuestión

+2

¿Cómo se encuentran todas las hojas sin atravesar todo el árbol? – Nifle

+1

No sin saber más sobre el problema. Normalmente es posible comenzar con un nodo y desplegarlo como en la búsqueda de amplitud, búsqueda en profundidad, profundización iterativa, etc. ¿Cómo se supone que debemos saber a priori que 9, 10, 11 y 12 están a tres saltos de 1? –

+0

¿Qué usaste para hacer esa imagen? –

Respuesta

7

Ejecute un BFS normal desde rootNode y deje depth[i] = linked list of nodes with depth i. Entonces para su ejemplo usted tendrá:

depth[1] = {1}, depth[2] = {2, 3, 4} etc.. Puede construir esto con una simple búsqueda BFS. A continuación, imprima todos los nodos en depth[maxDepth], entonces aquellos en depth[maxDepth - 1] etc.

La profundidad de un nodo i es igual a la profundidad de su nodo padre + 1. La profundidad del nodo raíz puede considerarse 1 o 0.

16

uso de una combinación de una pila y cola.

Haz la BFS 'normal' usando la cola (que supongo que ya sabes que hacer), y sigue empujando los nodos en la pila a medida que los encuentres.

Una vez hecho con BFS, la pila contendrá el orden inverso de BFS.