Skip to content

Latest commit

 

History

History
124 lines (94 loc) · 5.99 KB

0297.md

File metadata and controls

124 lines (94 loc) · 5.99 KB
title description keywords
297. 二叉树的序列化与反序列化
LeetCode 297. 二叉树的序列化与反序列化题解,Serialize and Deserialize Binary Tree,包含解题思路、复杂度分析以及完整的 JavaScript 代码实现。
LeetCode
297. 二叉树的序列化与反序列化
二叉树的序列化与反序列化
Serialize and Deserialize Binary Tree
解题思路
深度优先搜索
广度优先搜索
设计
字符串
二叉树

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

🔴 Hard  🔖  深度优先搜索 广度优先搜索 设计 字符串 二叉树  🔗 力扣 LeetCode

题目

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.

Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.

Clarification: The input/output format is the same as how LeetCode serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.

Example 1:

Input: root = [1,2,3,null,null,4,5]

Output: [1,2,3,null,null,4,5]

Example 2:

Input: root = []

Output: []

Constraints:

  • The number of nodes in the tree is in the range [0, 10^4].
  • -1000 <= Node.val <= 1000

题目大意

设计一个算法,来序列化和反序列化二叉树。并不限制如何进行序列化和反序列化,但是你需要保证二叉树可以序列化为字符串,并且这个字符串可以被反序列化成原有的二叉树。

解题思路

  1. 序列化其实就是二叉树的遍历,顺手把遍历的结果转化成字符串的形式;
  2. 反序列化就是二叉树的还原,把序列化字符串还原成二叉树;
  3. 以前序遍历为例,前序遍历的特点是根节点在开头,然后是左子树的前序遍历结果,然后是右子树的前序遍历结果;
  4. 序列化时,不存在的结点用 null 填充,左右子树之间用 ',' 分割;
  5. 反序列化过程中,首先将序列化字符串按逗号进行切分,得到一个节点值的列表。然后,通过递归地从这个列表中取值,构建二叉树。反序列化的过程中,每次取第一个值即为当前节点的值,然后递归构建左子树和右子树。

复杂度分析

  1. 时间复杂度O(n),其中 n 是二叉树的节点数量。

    • serialize 函数:对每个节点递归调用一次,因此每个节点被访问一次。
    • deserialize 函数:通过递归从数组构建二叉树,类似于前序遍历。每个节点会被递归处理一次。
  2. 空间复杂度O(n)

    • serialize 函数O(n)

      • 递归的调用栈深度同样取决于树的高度,最坏情况下二叉树的高度为 n(链状树),最坏情况下为 O(n)
      • 最终生成的字符串的长度大致为 n(每个节点值加上分隔符)。
    • deserialize 函数O(n)

      • 递归的调用栈深度同样取决于树的高度,最坏情况下为 O(n)
      • 存储拆分后的 nodes 数组占用的空间为 O(n)

代码

/**
 * Encodes a tree to a single string.
 *
 * @param {TreeNode} root
 * @return {string}
 */
var serialize = function (root) {
	if (!root) return 'null';
	let left = serialize(root.left);
	let right = serialize(root.right);
	return root.val + ',' + left + ',' + right;
};

/**
 * Decodes your encoded data to tree.
 *
 * @param {string} data
 * @return {TreeNode}
 */
var deserialize = function (data) {
	const buildTree = (nodes) => {
		const val = nodes.shift();
		if (val == 'null') return null;
		let root = new TreeNode(Number(val));
		root.left = buildTree(nodes);
		root.right = buildTree(nodes);
		return root;
	};

	const nodes = data.split(',');
	return buildTree(nodes);
};

相关题目

题号 标题 题解 标签 难度 力扣
271 字符串的编码与解码 🔒 设计 数组 字符串 🟠 🀄️ 🔗
428 序列化和反序列化 N 叉树 🔒 深度优先搜索 广度优先搜索 1+ 🔴 🀄️ 🔗
449 序列化和反序列化二叉搜索树 深度优先搜索 广度优先搜索 4+ 🟠 🀄️ 🔗
652 寻找重复的子树 深度优先搜索 哈希表 1+ 🟠 🀄️ 🔗