Given a binary tree, return the inorder traversal of its nodes’ values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?
解题思路一
标准的dfs遍历的题啊这是, 题目要求是前序遍历那么就按照 左子树 根结点右子树的顺序访问, 同理中序遍历和后续遍历。
解题代码
dfs递归
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
dfs(root, list);
return list;
}
public void dfs(TreeNode root, List<Integer> list){
if (root == null) return;
dfs(root.left, list);
list.add(root.val);
dfs(root.right, list);
}
}
解题思路二
做题的时候发现了很好的解题方法使用stack 保存左子树, 遍历到底时,弹栈访问右子树,反复执行此过程实现了前序遍历。结合代码注释和图示就比较清晰了~ 使用这个方法(还有98 和 230题)
// 通过stack 使用迭代的方法前序遍历 二叉树
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> s = new Stack<>();
List<Integer> list = new ArrayList<>();
while (!s.empty() || root != null){
//不断将左子树添加到stack中
while (root != null){
s.add(root);
root = root.left;
}
//如果左子树出现为空的时候 那么这个时候已经遍历到底,将此结点弹栈开始访问右子树
TreeNode node = s.pop();
list.add(node.val);
root = node.right;
}
return list;
}
}