297. 二叉树的序列化与反序列化(困难)

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]

二、解题

DFS

public class Codec 

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) 
        StringBuilder sb = new StringBuilder();//用于存储序列化结果
        serialize(root, sb);
        return sb.toString();
    

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) 
        LinkedList<String> nodes = new LinkedList<>();
        for (String s : data.split(",")) 
            nodes.addLast(s);
        
        return deserialize(nodes);
    

    //序列化:返回前序遍历结果/后序遍历结果,用,隔开了left,right,举例:1,2,#,4,#,#,3,#,#,
    public void serialize(TreeNode root, StringBuilder sb) 
        if (root == null)
            sb.append("#").append(",");
            return;
        
        //序列化前序遍历结果
        sb.append(root.val).append(",");
        serialize(root.left, sb);
        serialize(root.right, sb);

        // //序列化后序遍历结果
        // sb.append(root.val).append(",");
    

    //反序列化:对于前序遍历结果和后序遍历结果,都是以前序递归方式,不断构建根节点即可!
    // 因为只要左右孩子都为空,就return嘛,所以从形象来看,就是不断从下往上建立根节点!
    public TreeNode deserialize(LinkedList<String> nodes)
        if (nodes.isEmpty())
            return null;
        String node = nodes.removeFirst();
        if (node.equals("#")) return null;
        TreeNode treeNode = new TreeNode(Integer.parseInt(node));
        // TreeNode treeNode = node.equals("#")? null : new TreeNode(Integer.parseInt(node));
        treeNode.left = deserialize(nodes);
        treeNode.right = deserialize(nodes);
        return treeNode;
    

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于297. 二叉树的序列化与反序列化(困难)的主要内容,如果未能解决你的问题,请参考以下文章

297. 二叉树的序列化与反序列化.

[JavaScript 刷题] 树 - 二叉树的序列化与反序列化, leetcode 297

[JavaScript 刷题] 树 - 二叉树的序列化与反序列化, leetcode 297

Leetcode 297. 二叉树的序列化与反序列化

LeetCode 297. 二叉树的序列化与反序列化(bfs,二叉树,Java)

[H二叉树] lc297. 二叉树的序列化与反序列化(二叉树+前序遍历+中序遍历+面试经典)