给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
1 //递归算法
2 class Solution {
3 public List<Integer> postorderTraversal(TreeNode root) {
4 List<Integer> list = new ArrayList<Integer>();
5 if(root==null) return list;
6 postorder(root,list);
7 return list;
8 }
9 public List<Integer> postorder(TreeNode node,List<Integer> list){
10 if(node.left!=null)postorder(node.left,list);
11 if(node.right!=null)postorder(node.right,list);
12 list.add(node.val);
13 return list;
14 }
15 }
16 //迭代算法
17 class Solution {
18 public List<Integer> postorderTraversal(TreeNode root) {
19 List<Integer> list = new ArrayList<Integer>();
20 if(root==null)return list;
21 Stack<TreeNode> stack = new Stack<TreeNode>();
22 Stack<TreeNode> stackresult = new Stack<TreeNode>();
23 stack.push(root);
24 while(!stack.empty()){
25 TreeNode tmpnode = stack.pop();
26 stackresult.push(tmpnode);
27 if(tmpnode.left!=null)stack.push(tmpnode.left);
28 if(tmpnode.right!=null)stack.push(tmpnode.right);
29 }
30 while(!stackresult.empty()){
31 TreeNode tmpnode = stackresult.pop();
32 list.add(tmpnode.val);
33 }
34 return list;
35 }
36 }
直观想法:前序遍历的结果反转过来的结果是否就是后序遍历?再进一步分析在前序遍历的基础上改变下压栈的顺序即可。