Je suis au courant de postorder traversant:pourquoi 2 piles sont si efficaces pour postorder Transverses
L -> R -> P (De gauche à droite au parent).
je vis un code qui pourrait effectuer une traversal postorder tout en utilisant élégamment 2 piles:
public void postOrderTransverse(Node r){
if(r == null){return;}
Stack<Node> s = new Stack<Node>();
Stack<Node> reverser = new Stack<Node>();
s.push(r);
while(!s.isEmpty()){
Node temp = s.pop();
reverser.push(temp);
if (temp.left != null){
s.push(temp.left);}
if(temp.right != null){
s.push(temp.right);}
}
while(!reverser.empty()){
System.out.print(reverser.peek());
reverser.pop();
}
}
(via http://articles.leetcode.com/binary-tree-post-order-traversal/)
où l'essentiel, une pile inverse juste l'autre. Je suis juste très curieux de savoir comment cela fonctionne. J'ai une hypothèse que Stack s accepte l'entrée pour que la sortie soit quelque chose comme P -> R -> L, et il passe juste cela sur Stack inverser qui crache L -> R .-> P puisque c'est Last In First Out . Cependant, juste en essayant de réfléchir aux processus de cet algorithme, j'ai du mal à comprendre comment et pourquoi Stack s prend son entrée comme il le fait. En espérant que je pourrais avoir un aperçu ici! Merci :)
Il fait un traversal pré-commande en utilisant la première pile, et en poussant les résultats sur la deuxième pile, popping alors que la pile, ce qui vous donne une traversée après commande simplement en inversant les résultats. – EJP
@EJP, il ne fait pas de traversée de pré-commande, car il traverse d'abord le noeud droit. En fait, il s'agit d'une version en boucle d'un parcours post-ordre récursif. – user3707125