94. Binary Tree Inorder Traversal
1. Recursive
1 public List<Integer> inorderTraversal(TreeNode root) { 2 List<Integer> res = new ArrayList<Integer>(); 3 if(root == null) { 4 return res; 5 } 6 dfs(res, root); 7 return res; 8 } 9 10 private void dfs(List<Integer> res, TreeNode root) { 11 if(root == null) { 12 return; 13 } 14 dfs(res, root.left); 15 res.add(root.val); 16 dfs(res, root.right); 17 }
2. iterative
建一个堆栈,如果是左边还有节点,那就一直走到底。
如果发现已经没有左节点了,那么就从堆栈里弹出最后一个,访问它,然后指向它的右节点(因为它的全部左节点和它本身都已经被访问过了)
1 public List<Integer> inorderTraversal(TreeNode root) { 2 List<Integer> res = new ArrayList<Integer>(); 3 if(root == null) { 4 return res; 5 } 6 Stack<TreeNode> stack = new Stack<TreeNode>(); 7 stack.push(root); 8 TreeNode p = root; 9 while(!stack.isEmpty() || p != null) { 10 if(p != null) { 11 stack.push(p); 12 p = p.left; 13 } else { 14 TreeNode cur = stack.pop(); 15 res.add(p.val); 16 p = p.right; 17 } 18 } 19 return res; 20 }