Il mio piano è quello di utilizzare due pile. Uno per attraversare il preordine e un altro per attraversare il post-ordine. Ora eseguo DFS iterativo standard (deep-first traversal), e non appena I pop
dallo stack "pre" lo sposto nello stack "post". Alla fine, il mio stack "post" avrà il nodo figlio in alto e radice in basso.
treeSearch(Tree root) {
Stack pre;
Stack post;
pre.add(root);
while (pre.isNotEmpty()) {
int x = pre.pop();
// do pre-order visit here on x
post.add(x);
pre.addAll(getChildren(x));
}
while (post.isNotEmpty()) {
int y = post.pop();
// do post-order visit here on y
}
}
root
sarà sempre attraversati da ultimo post
pila come rimarrà sul fondo.
Questo è semplice codice Java:
public void treeSearch(Tree tree) {
Stack<Integer> preStack = new Stack<Integer>();
Stack<Integer> postStack = new Stack<Integer>();
preStack.add(tree.root);
while (!preStack.isEmpty()) {
int currentNode = preStack.pop();
// do pre-order visit on current node
postStack.add(currentNode);
int[] children = tree.getNeighbours(currentNode);
for (int child : children) {
preStack.add(child);
}
}
while (!postStack.isEmpty()) {
int currentNode = postStack.pop();
// do post-order visit on current node
}
}
sto presupponendo che questo è un albero, così: alcun ciclo e senza rivisitare stesso nodo nuovo. Ma, se vogliamo, possiamo sempre avere un array visitato e controllarlo.
domanda abbastanza generica, con i requisiti piuttosto specifici;). Che dire semplicemente chiedendo suggerimenti su una traversata iterativa - le operazioni di pre/post saranno più che adeguate;). –
Sembra "chiunque può mostrarmi come eseguire iterazioni su array ed eseguire la funzione su ciascun elemento". Qual è il problema con l'iterazione passo dopo passo, proprio come hai descritto? –
Ogni genitore deve essere visitato prima dei suoi figli (pre-operazione), quindi visitato di nuovo dopo i suoi figli (dopo l'operazione). Perdiamo quel contesto quando iteriamo su un array. Facile da fare in modo ricorsivo, ma mi fa battere come farlo in modo iterativo. – xeolabs