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?
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */
//后序遍历:left->right->root public class Solution { //方法与前两题先序、中序遍历一模一样 public ArrayList<Integer> postorderTraversal(ArrayList<Integer> list,TreeNode root){ if(root==null) return list; if(root.left!=null) postorderTraversal(list,root.left); if(root.right!=null) postorderTraversal(list,root.right); list.add(root.val); return list; } public List<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); if(root==null) return result; if(root.left!=null) postorderTraversal(result,root.left); if(root.right!=null) postorderTraversal(result,root.right); result.add(root.val); return result; } }
//利用栈的迭代写法,思想参考中序遍历注释,只是while重新压入栈的顺序变化 public class Solution { public List<Integer> postorderTraversal(TreeNode root) { ArrayList<Integer> result = new ArrayList<Integer>(); if(root==null) return result; Stack<TreeNode> nodeStack = new Stack<TreeNode>(); Stack<Integer> countStack = new Stack<Integer>(); nodeStack.push(root); countStack.push(0); while(!nodeStack.empty()){ TreeNode node = nodeStack.pop(); int count = countStack.pop(); if(count==1){ result.add(node.val); }else{ nodeStack.push(node); countStack.push(1); if(node.right!=null){ nodeStack.push(node.right); countStack.push(0); } if(node.left!=null){ nodeStack.push(node.left); countStack.push(0); } } } return result; } }