博客主页:@花无缺
欢迎 点赞 收藏⭐ 留言 加关注✅!
本文由 花无缺 原创收录于专栏 【力扣题解】
P94.二叉树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
[0, 100]
内-100 <= Node.val <= 100
递归法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return res;
}
public void inorder(TreeNode root, List<Integer> list) {
// 节点为空, 递归终止
if (root == null) {
return;
}
// 递归遍历左子树
inorder(root.left, list);
// 遍历根节点
list.add(root.val);
// 递归遍历右子树
inorder(root.right, list);
}
时间复杂度:O(n)
,其中 n 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
迭代法:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
// 空树, 返回空列表
if (root == null) {
return res;
}
// 用栈模拟模拟递归
Deque<TreeNode> stack = new LinkedList<>();
// 使用一个额外的辅助指针帮助我们进行中序遍历
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// 指针 cur 访问到最底层的最左边的节点
// 同时将访问到的所有节点入栈
if (cur != null) {
stack.offerLast(cur);
// 左
cur = cur.left;
} else {
cur = stack.pollLast();
// 中
res.add(cur.val);
// 右
cur = cur.right;
}
}
return res;
}
时间复杂度:O(n)
,其中 n 为二叉树节点的个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。
首先我们先来了解什么是二叉树的中序遍历:二叉树的中序遍历就是按照:左子树->根节点->右子树
的顺序遍历这棵二叉树。对于二叉树的操作,我们首先就会想到递归的方法。
而对于迭代法,其实也是递归思想,递归法隐式地维护了一个栈,而迭代法就是显式的维护一个栈达到模拟递归的效果。而二叉树的中序遍历的迭代法和前序遍历、后序遍历又有不一样的地方,我们知道对于二叉树的前序遍历和后序遍历,都是从根节点开始入栈并出栈,也就是说访问的节点就是我们要操作的节点,但是对于中序遍历来说就不是这样的,因为我们第一个访问的节点是根节点,但是我们首先应该是要操作左子树节点,所以中序遍历和另外两种遍历并不是完全相同的,我们需要借助一个指针先找到二叉树的最左下的节点,然后再开始迭代的操作。
作者:花无缺(huawuque404.com)
欢迎
关注
我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
一起进步-刷题专栏:【力扣题解】
往期精彩好文:
【CSS选择器全解指南】
【HTML万字详解】
你们的点赞 收藏⭐ 留言 关注✅
是我持续创作,输出优质内容
的最大动力!
谢谢!