本题有iterative和recursive两种解法,recursive比较简单而iterative则需要一些小技巧~
- Iterative solution
思路:前序遍历的顺序是中左右,后序遍历的顺序是左右中,我们可以改进前序遍历的代码来实现中右左,然后再反转一下列表来得到想要的结果。此外我们这里声明为LinkedList,目的是可以通过使用addFirst()方法来避免reverse整个列表。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<Integer> postorderTraversal(TreeNode root) { // Pay attention to the type of res should be LinkedList instead of List LinkedList<Integer> res = new LinkedList<>(); if(root == null){ return res; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); while(!stack.empty()){ TreeNode curr = stack.pop(); // addFirst is used to insert an element at the beginning of a LinkedList. res.addFirst(curr.val); if(curr.left != null){ stack.push(curr.left); } if(curr.right != null){ stack.push(curr.right); } } return res; } }
- Recursive solution
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new LinkedList<>(); helper(root, res); return res; } private void helper(TreeNode node, List<Integer> list){ if(node == null){ return; } helper(node.left, list); helper(node.right,list); list.add(node.val); } }