【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 297. 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化
为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
示例 4:
输入:root = [1,2] 输出:[1,2]
提示:
树中结点数在范围 [0, 104] 内
-1000 <= Node.val <= 1000
参考代码
定义一颗树
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("xxxx结果 = " + preorderTraversal(treeNode));
}
-
要知道这是一棵树,只是通过数组的形式表现出来的
简单的用这颗树来举例
关键点 :
可以先序遍历这颗二叉树,遇到空子树的时候序列化成 逗号,否则继续递归序列化。那么我们如何反序列化呢?首先我们需要根据 , 把原先的序列分割开来得到先序遍历的元素列表,然后从左向右遍历这个序列:
如果当前的元素为 逗号,则当前为空树
否则先解析这棵树的左子树,再解析它的右子树
/**
* 二叉树的数的序列化和反序列化,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失。
* 所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化;将二叉树的数据保存到了磁盘之后,还需要将
* 磁盘中的二叉树的数据加载到内存中去,这过程叫做反序列化。
*
* 解决思路:节点和节点之间使用,来分隔,空节点使用#来表示,为什么需要使用#来分隔?
* 假如所有的节点都是相同的值,且不使用分隔符号,结构不同也会序列化为相同的结果
*/
public static String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
encode(root, sb);
return sb.toString();
}
private static void encode(TreeNode node, StringBuilder sb) {
if (node == null) {
sb.append("#,");
} else {
sb.append(node.val);
sb.append(",");
encode(node.left, sb);
encode(node.right, sb);
}
}
// Decodes your encoded data to tree.
public static TreeNode deserialize(String data) {
String[] vs = data.split(",");
return decode(vs, new int[]{0});
}
private static TreeNode decode(String[] vs, int[] idx) {
if (vs.length == 0 || idx[0] >= vs.length) {
return null;
}
String s = vs[idx[0]];
idx[0]++;
if ("#".equals(s)) {
return null;
} else {
int val = Integer.valueOf(s);
TreeNode node = new TreeNode(val);
node.left = decode(vs, idx);
node.right = decode(vs, idx);
return node;
}
}
真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话
求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!
如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️