给出一棵二叉树,返回其节点值的后序遍历。
Given a binary tree, return the postorder traversal of its nodes’ values.
样例
给出一棵二叉树 {1,#,2,3},
1
\
2
/
3
返回 [3,2,1]
解法:
使用两个栈,第二个栈记录第一个栈对应节点被访问的次数。只有当被访问到第三次时,要被输出且不必重新压栈。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Postorder in ArrayList which contains node values.
*/
public ArrayList<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();//结果集
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<Integer> counter = new Stack<Integer>();//记录节点被访问次数
TreeNode p = root;
while(p != null || !stack.empty()) {
while(p != null) {
stack.push(p);
counter.push(1);
p = p.left;
}
if(!stack.empty()) {
p = stack.pop();
int count = counter.pop();
count++;
if(count == 3) {
list.add(p.val);
p = null;
continue;
}
stack.push(p);
counter.push(count);
p = p.right;
}
}
return list;
}
}