本文正在参加「Java主题月 - Java 刷题打卡」,详情查看<活动链接>
【Java 刷题打卡】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.
😄
那就干吧! 这个专栏都是刷的题目都是关于二叉树的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法2121112。二叉树的内容不多,但是都是每个程序员必备的,对了解红黑树、B+树、LSM树都非常有帮助等等
WAL+LSM-tree实现的leveldb和rocksdb
B+ 树的mysql
(HBASE) - LSM-tree的架构把random write转成sequential write,多层的compaction和lookup,存在写放大和读放大
TokuDB索引结构--Fractal Tree
还有更多,值得咱们发掘。
leecode 94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
输入: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
首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
参考代码
定义一颗树
class TreeNode {
int val; // 头结点
TreeNode left; // 左子树
TreeNode right; // 右子树
TreeNode(int x) {
val = x;
}
}
// 测试方法
public static void main(String[] args) {
TreeNode treeNode = new TreeNode(1);
treeNode.left = new TreeNode(2);
treeNode.right = new TreeNode(3);
System.out.println("中序遍历结果 = " + inorderTraversal(treeNode));
}
JAVA语言版 递归
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>(); // 定义一个返回的遍历结果集合
inorder(root, res); // 入口
return res; // 结束
}
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) { // 1. 这棵树为空,返回 2. 左子树为空返回上一步 3.右子树为空返回上一步
return;
}
inorder(root.left, res); // 2-1找到左子树最下面的那个为空的节点
res.add(root.val); // 将这颗树最下面的左节点添加进结果集合 或者
//将这棵树最下面的右节点添加进结果集合
inorder(root.right, res); // 找到这棵树的右子树最下面的为空的节点
}
JAVA语言版 迭代 栈:先进后出
定义一个栈,栈存的就是一棵树
1.先将整颗树怼进去,在把所有的左子树怼进去
2.遍历左子树,直接左边的最下边
3.因为先进后出,拿到了最下面的左节点
4.怼到数组里
5.看以右节点为根的还有没有左节点,有就回到上面第1步,没有就走第3步,把根节点怼进去,在怼右节点。
public static List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
if(root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>(); // 栈先进后出
TreeNode cur = root;
while(cur != null || !stack.isEmpty()) { // 8.curr = null, statck.size = 1 12.cur != null 18.cur = null, stack.size = 0
while(cur != null) {
stack.push(cur); // 进栈 1.将整个cur推进stack里面 3.将左节点推进stack,此时stack.size = 2 13.将3,null,null推进栈
cur = cur.left; // 2.将cur的left赋值给cur,cur就成为了左节点 4.此时的cur的左节点为null 14.cur = null
}
cur = stack.pop(); // 出栈 5.因为先进后出,所以cur=root的左节点(这里需要有空间想象) 9.将之前的root弹出来 15.cur = 3
list.add(cur.val); // 6.此时val = 2,因为在第4步整个cur的左节点都为null,如果它有右节点也是排在2后面的 10. 添加根节点1 16. 添加根节点3
cur = cur.right; // 7.cur = null 11. cur = 3,null,null 17.cur = null
}
return list;
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️