2010-04-05 6 views
17

Chiunque ha una implementazione pronta dell'algoritmo Reverse Breadth First traversal in C#?Reverse Breadth First traversal in C#

Per larghezza inversa Prima attraversamento, intendo invece di cercare un albero partendo da un nodo comune, voglio cercare l'albero dal basso e gradualmente convergere in un nodo comune.

Vediamo la figura qui sotto, questo è l'uscita di un Larghezza primo attraversamento: alt text

Nel mio rovescio ampiezza primo attraversamento, 9, 10, 11 e 12 saranno i primi nodi trovati (l'ordine di loro non sono importanti in quanto sono tutti il ​​primo ordine). 5, 6, 7 e 8 sono i secondi nodi trovati e così via. 1 sarebbe l'ultimo nodo trovato.

Qualsiasi idea o suggerimento?

Modifica: Modifica "ricerca in ampiezza" a "Larghezza Prima traversal" per chiarire la questione

+2

Come trovi tutte le foglie senza attraversare l'intero albero? – Nifle

+1

Non senza sapere di più sul problema. Di solito è possibile iniziare con un nodo e fan out, come nella ricerca in ampiezza, in profondità, in approfondimento iterativo, ecc. Come dovremmo sapere a priori che 9, 10, 11 e 12 sono tre hop da 1? –

+0

Cosa hai usato per rendere quell'immagine? –

risposta

7

Eseguire un BFS normale da rootNode e lasciare depth[i] = linked list of nodes with depth i. Quindi per il tuo esempio avrai:

depth[1] = {1}, depth[2] = {2, 3, 4} etc.. Puoi creare questo con una semplice ricerca BFS. Quindi stampare tutti i nodi in depth[maxDepth], poi quelli depth[maxDepth - 1] ecc

La profondità di un nodo i è uguale alla profondità del suo nodo padre + 1. La profondità del nodo radice può essere considerato 1 o 0.

16

utilizzare una combinazione di una pila e una coda.

Fai il BFS "normale" utilizzando la coda (che presumo tu sappia già fare), e continua a spingere i nodi nello stack mentre li incontri.

Una volta eseguito con BFS, lo stack conterrà l'ordine BFS inverso.