【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS

简介: 【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS

序列化和反序列化二叉搜索树【LC449】

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化二叉搜索树 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

BFS
  • 思路
  • 序列化:按照层序遍历序列化二叉搜索树,每个值以","分隔,不记录null值

image.png

//@背书包的小白熊
public class Codec {
    // Encodes a tree to a single string.
    //java广度优先搜索层序遍历,记录所有节点的val值,用逗号隔开
    public String serialize(TreeNode root) {
        if (root == null) return "";
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        StringBuilder sb = new StringBuilder();
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            sb.append(cur.val).append(",");
            if (cur.left != null) queue.offer(cur.left);
            if (cur.right != null) queue.offer(cur.right);
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
    // Decodes your encoded data to tree.
    //将字符串恢复成树
    public TreeNode deserialize(String data) {
        if (data.equals("")) return null;
        //将data分隔开
        String[] arr = data.split(",");
        //初始化根节点
        TreeNode root = new TreeNode(Integer.valueOf(arr[0]));
        //从第二个节点开始循环,二叉搜索树的特点是:
        //1.非空左子树的所有键值小于其根结点的键值。
        //2.非空右子树的所有键值大于其根结点的键值。
        //3.左、右子树都是二叉搜索树。
        //利用此性质,每次搜索插入节点时间复杂度为O(logn),总体时间复杂度为O(nlogn)
        for (int i = 1; i < arr.length; i++) {
            int x = Integer.valueOf(arr[i]);
            TreeNode cur = root;
            while (cur != null) {   
                //如果左子树为空,并且x < cur.val 证明此节点就是需要插入的节点位置
                if (cur.left == null && x < cur.val) {
                    cur.left = new TreeNode(x);
                    break;
                    //如果右子树为空,并且x > cur.val 证明此节点就是需要插入的节点位置
                } else if (cur.right == null && x > cur.val) {
                    cur.right = new TreeNode(x);
                    break;
                }              
                //选择向左或向右遍历
                if (x < cur.val) cur = cur.left;
                else cur = cur.right;
            }
        }
        return root;
    }
}

image.png

目录
相关文章
|
1月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
存储 Java 数据库
|
3月前
|
Go
golang力扣leetcode 297.二叉树的序列化与反序列化
golang力扣leetcode 297.二叉树的序列化与反序列化
24 0
|
5月前
|
存储 算法 Python
Python算法——树的序列化与反序列化
Python算法——树的序列化与反序列化
152 1
|
3月前
|
存储 算法 C++
leetcode-297:二叉树的序列化与反序列化
leetcode-297:二叉树的序列化与反序列化
22 1
|
3月前
|
分布式计算 Java 大数据
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
IO流【Java对象的序列化和反序列化、File类在IO中的作用、装饰器模式构建IO流体系、Apache commons-io工具包的使用】(四)-全面详解(学习总结---从入门到深化)
53 0
|
14天前
|
存储 Java
Java输入输出:解释一下序列化和反序列化。
Java中的序列化和反序列化是将对象转换为字节流和反之的过程。ObjectOutputStream用于序列化,ObjectInputStream则用于反序列化。示例展示了如何创建一个实现Serializable接口的Person类,并将其序列化到文件,然后从文件反序列化回Person对象。
24 5
|
1月前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
13 0
|
1月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
27 0
|
1月前
|
存储 JSON 网络协议
【计算机网络】序列化,反序列化和初识协议
【计算机网络】序列化,反序列化和初识协议

热门文章

最新文章