1.题目
给定一个二叉树的根节点root,返回它的中序遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2]
输出:[2,1]
示例 5:
输入:root = [1,null,2]
输出:[1,2]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2.答题
2.1 思路1(递归)
递归,有限遍历左子树
代码如下:
/**
* 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> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
inorderTraversal(root, list);
return list;
}
public void inorderTraversal(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
if (root.left != null) {
inorderTraversal(root.left, list);
}
list.add(root.val);
if (root.right != null) {
inorderTraversal(root.right, list);
}
}
}
时间复杂度
O(n)
空间复杂度
O(n),由于使用了递归,会缓存调用栈,当二叉树弱化成了类链表结构时,会出现最差情况
提交结果
之前讲过,使用递归时需要注意:警惕堆栈溢出和警惕重复计算,在本题中可能遇到的情况是,二叉树深度过高,导致递归的调用栈深度过高,虽然时间复杂度不错。
2.2 思路2(非递归)
题目提示:使用迭代算法解决?
其实感觉使用回溯算法会更直接,从根节点开始遍历左子树,直到左子树为null,此时需要回溯到当前节点的父节点,将结点值放入结果中,以其右子树为根节点遍历其左子树,直到所有值遍历完成。
其实需要关注的是如何回溯到最后一个结点的父节点。此时需要一个数据结构存储当前执行的位置。
代码如下:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
List<TreeNode> cache = new ArrayList<>();
while(root != null || !cache.isEmpty()) {
if (root != null) {
cache.add(root);
root = root.left;
} else {
root = cache.remove(cache.size() - 1);
list.add(root.val);
root = root.right;
}
}
return list;
}
}
时间复杂度
O(n)
空间复杂度
O(n)