给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [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 }
直观想法:前序遍历的结果反转过来的结果是否就是后序遍历?再进一步分析在前序遍历的基础上改变下压栈的顺序即可。