Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
Note: Recursive solution is trivial, could you do it iteratively?
后根遍历指:首先遍历左子树,然后遍历右子树,最后遍历访问根结点。
不许用递归了,那我就用的栈。把 某个结点的左右子树是否访问 记录下来。public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root==null){
return list;
}
Stack<TreeNodeUsed> stack=new Stack<>();
stack.push(new TreeNodeUsed(root));
while(!stack.isEmpty()){
TreeNodeUsed nodeUsed=stack.pop();
if(nodeUsed.leftUsed==true&&nodeUsed.rightUsed==true){
list.add(nodeUsed.node.val);
}
else{
nodeUsed.rightUsed=true;
nodeUsed.leftUsed=true;
stack.push(nodeUsed);
if(nodeUsed.node.right!=null){
stack.push(new TreeNodeUsed(nodeUsed.node.right));
}
if(nodeUsed.node.left!=null){
stack.push(new TreeNodeUsed(nodeUsed.node.left));
}
}
}
return list;
}
class TreeNodeUsed{
TreeNode node;
boolean leftUsed;
boolean rightUsed;
public TreeNodeUsed(TreeNode n){
node=n;
leftUsed=false;
rightUsed=false;
}
}
有大神也用的栈,但是方法比我简洁得多:public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> ans = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
if (root == null) return ans;
stack.push(root);
while (!stack.isEmpty()) {
TreeNode cur = stack.pop();
ans.addFirst(cur.val);
if (cur.left != null) {
stack.push(cur.left);
}
if (cur.right != null) {
stack.push(cur.right);
}
}
return ans;
}
精髓在于"add first",把数字添加到链表的最前部。这样先被pop出来的node值反而会写在结果链表的后面。我们只要使栈pop出来的顺序是 根->右->左,这样出来的结果链表的顺序就自然的反向,成为 左->右->根。