BM24 二叉树的中序遍历
题目描述:
给定一个二叉树,返回它的中序遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,3,2]
解决思路:
- 迭代解法:使用栈来实现中序遍历,先将根节点入栈,依次将其左孩子入栈,直到左孩子为空,此时需要弹出栈顶节点进行遍历,然后将右孩子入栈,重复上述步骤直到栈为空。
- 递归解法:递归遍历左孩子,遍历根节点,递归遍历右孩子。
代码示例:
迭代解法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
// 将所有左孩子入栈
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
// 弹出栈顶元素,加入结果集,并遍历其右子树
curr = stack.pop();
res.add(curr.val);
curr = curr.right;
}
return res;
}
递归解法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return res;
}
private void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
复杂度分析:
- 迭代解法:时间复杂度为O(n),空间复杂度为O(n),空间复杂度为栈的深度,最坏情况下为O(n)。
- 递归解法:时间复杂度为O(n),递归调用栈的深度为树的高度,最坏情况下为O(n),空间复杂度为O(n)。