【每天学习一点算法 2026/04/03】二叉树的序列化与反序列化

每天学习一点算法 2026/04/03

题目:二叉树的序列化与反序列化

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

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

我这里采用了广度优先的方法遍历存储节点值,遇到空节点时用 # 代替:

typescript 复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

/*
 * Encodes a tree to a single string.
 */
function serialize(root: TreeNode | null): string {
  if (!root) return '' // 空树直接返回空字符串
  const res = [] // 存储节点值
  const queue = [root] // 队列初始放入根节点
  while (queue.length > 0) {
    const node = queue.shift() // 弹出根节点
    res.push(typeof node?.val == 'number' ? node.val : '#') // 记录节点值
    if (node) {
      // 左右子节点依次入队列
      node.left ? queue.push(node.left) : queue.push(null)
      node.right ? queue.push(node.right) : queue.push(null)
    }
  }
  return res.join(',') // 返回结果字符串有负数所以需要逗号隔开
};

/*
 * Decodes your encoded data to tree.
 */
function deserialize(data: string): TreeNode | null {
  if (data.length === 0) return null // 根节点为空的情况直接返回 null
  const dataArr = data.split(',') // 分割节点值
  const root = new TreeNode(Number(dataArr[0])) // 创建根节点
  const pre = [root] // 存放非空节点用于绑定子节点
  let preNode = null
  for (let i = 1; i < dataArr.length; i++) {
    if (i % 2 === 1) {
      // 弹出未绑定子节点的节点
      preNode = pre.shift()
    }
    if (dataArr[i] !== '#') {
      // 只处理不为空的情况
      const node = new TreeNode(Number(dataArr[i]))
      // 按序绑定左右子节点
      i % 2 === 0 ? preNode.right = node : preNode.left = node
      // 保存非空节点
      pre.push(node)
    }
  }
  return root
};


/**
 * Your functions will be called as such:
 * deserialize(serialize(root));
 */

题目来源:力扣(LeetCode)

相关推荐
Tisfy1 分钟前
LeetCode 0301.删除无效的括号:二进制枚举 / 回溯
算法·leetcode·字符串·题解·回溯·括号匹配·二进制枚举
Nil2089 分钟前
leetcode 322零钱兑换
算法·leetcode·职场和发展
老王爱玩车12 分钟前
动态内存管理
c语言·开发语言·学习·面试
海绵宝宝转agent13 分钟前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi01124 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
木井巳25 分钟前
【BFS 解决拓扑排序】课程表
java·算法·leetcode·广度优先·宽度优先·推荐算法·图搜索算法
扶风ff1 小时前
练题簿在线免费刷题:会员线下组卷、Word 试卷与成绩导入,课堂检测更方便
java·开发语言·算法·小程序·word
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
-dzk-1 小时前
【多维动态规划】LC 1143.最长公共子序列
算法·动态规划
C++ 老炮儿的技术栈1 小时前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c