10.二叉树的序列化与反序列化|Java 刷题打卡

837 阅读2分钟

【Java 刷题打卡】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

那就干吧! 这个专栏都是刷的题目都是关于二叉树的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法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:

图片.png

输入: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));
}        
  1. 要知道这是一棵树,只是通过数组的形式表现出来的

    简单的用这颗树来举例

图片.png

关键点 :

可以先序遍历这颗二叉树,遇到空子树的时候序列化成 逗号,否则继续递归序列化。那么我们如何反序列化呢?首先我们需要根据 , 把原先的序列分割开来得到先序遍历的元素列表,然后从左向右遍历这个序列:

如果当前的元素为 逗号,则当前为空树

否则先解析这棵树的左子树,再解析它的右子树

/**
     * 二叉树的数的序列化和反序列化,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失。
     * 所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化;将二叉树的数据保存到了磁盘之后,还需要将
     * 磁盘中的二叉树的数据加载到内存中去,这过程叫做反序列化。
     *
     * 解决思路:节点和节点之间使用,来分隔,空节点使用#来表示,为什么需要使用#来分隔?
     * 假如所有的节点都是相同的值,且不使用分隔符号,结构不同也会序列化为相同的结果
     */
    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块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️