一、需求
- 给定一个二叉树的根节点
root
,返回它的 中序 遍历。
输入:root = [1,null,2,3] 输出:[1,3,2]
提示:
- 树中节点数目在范围
[0, 100]
内-100 <= Node.val <= 100
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
二、递归法
2.1 思路分析
- 中序遍历,按照左、根、右的顺序遍历即可;
2.2 代码实现
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
infixOrder(root);
return res;
}
private void infixOrder(TreeNode root) {
if(root == null) {
return;
}
infixOrder(root.left);
res.add(root.val);
infixOrder(root.right);
}
}
2.3 复杂度分析
- 时间复杂度为O(N),其中N为二叉树的节点个数;
- 空间复杂度为O(N),最坏情况下,二叉树退化为链表,则递归的深度达到N;
三、迭代法
3.1 思路分析
- 该方法与递归的区别在于递归相当于隐式的维护了一个栈结构,迭代法将这个栈结构显示的表达出来;
3.2 代码实现
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
while(root != null || !stack.isEmpty()) {
//将根节点及其左子树入栈
while(root != null) {
stack.push(root);
root = root.left;
}
//处理当前节点
root = stack.pop();
res.add(root.val);
//处理右子树
root = root.right;
}
return res;
}
}
3.3 复杂度分析
- 时间复杂度为O(N);
- 空间复杂度为O(N);
四、学习地址
作者:LeetCode-Solution