剑指Offer|LCR 048.二叉树的序列化与反序列化

LCR 048.二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例 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]

提示:

  • 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,也可以采用其他的方法解决这个问题。
  • 树中结点数在范围 [0, 104]
  • -1000 <= Node.val <= 1000

法1:递归

分析:

二叉树的序列化(树转为序列)

  • 空节点使用#代替
  • 返回根结点的值、左节点的值、右节点的值

反序列化(序列转为树)

  • 将数组使用逗号分割开,获取数组
  • 遇到#,则返回null
  • 否则,就设置为str的结点,最后返回节点
js 复制代码
function TreeNode(val) {
    this.val = val;
    this.left = this.right = null;
}

 var serialize = function(root) {
    if(root === null) return "#"; // 用 # 表示空节点
    let leftStr = serialize(root.left);
    let rightStr = serialize(root.right);
    return `${root.val},${leftStr},${rightStr}`; // 使用逗号连接值
};

var deserialize = function(data) {
    const nodeStrs = data.split(",");
    let index = 0;
    return dfs(nodeStrs); 

    function dfs(strs){
        let str = strs[index++];
        if(str === "#") return null;

        let node = new TreeNode(parseInt(str));
        node.left = dfs(strs);
        node.right = dfs(strs);
        return node;
    }
};
相关推荐
会编程的土豆15 分钟前
常用算法里的细节
数据结构·c++·算法·图论
skilllite作者16 分钟前
为什么我认为 Hermes 需要说明 self-evolution 的设计来源
人工智能·算法·rust·openclaw·agentskills
iReachers17 分钟前
HTML打包EXE工具四种弹窗方式图文详解 - 单窗口/新窗口/标签页/浏览器打开
前端·javascript·html·弹窗·html打包exe·html转程序
tankeven21 分钟前
HJ179 小苯的IDE括号问题(easy)
c++·算法
华农DrLai23 分钟前
什么是推荐系统中的负反馈?用户的“踩“和“不感兴趣“怎么用?
人工智能·算法·llm·prompt·知识图谱
木斯佳25 分钟前
前端八股文面经大全:京东零售JDY前端一面(2026-04-14)·面经深度解析
前端·算法·设计模式·ai·断点续传
zore_c25 分钟前
【C++】C++——类的默认成员函数(构造、析构、拷贝构造函数)
java·c语言·c++·笔记·算法·排序算法
耗子君QAQ26 分钟前
🔧 Rattail | 面向 Vite+ 和 AI Agent 的前端工具链
前端·javascript·vue.js
生信研究猿28 分钟前
第2题-模型推理量化加速优化问题
python·算法
萑澈9 小时前
Windows 7 运行 Electron 安装包报“不是有效的 Win32 应用程序”怎么办
javascript·windows·electron