所以我熟悉后序遍历:
L -> R -> P(从左到右到父级)。
我看到一个代码可以使用 2 个堆栈非常优雅地执行后序遍历:
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();
}
}
(通过http://articles.leetcode.com/binary-tree-post-order-traversal/)
从本质上讲,一个堆栈只是反转另一个堆栈。我只是很好奇这是如何工作的。我有一个假设 Stack s 接受输入,因此输出类似于 P -> R -> L,它只是将其传递给 Stack reverser,后者吐出 L -> R .-> P,因为它是后进先出.
然而,只是想通过这个算法的过程来思考,我很难理解 Stack s 如何以及为什么以它的方式接受它的输入。希望我能对这里有所了解!谢谢 :)