297. 二叉树的序列化与反序列化
题目
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例 1:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
基本思路
- 序列化:
-
通过对二叉树进行搜索(深搜或者广搜)来进行序列化
-
使用先序遍历来实现序列
-
当遇到nullptr,将"null"加入序列
-
并且每个结点之间要用一定的符号进行分隔,这里使用","
-
方便后面的反序列化
- 反序列化
-
先将序列以","分隔成单个元素,用vector<string>来存储
-
通过先序遍历来建树
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
// 序列化
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if (root == nullptr) return "null";
string l = serialize(root->left);
string r = serialize(root->right);
// 以","标记每个元素之间,保证先序(根,左,右)的顺序
return to_string(root->val) + "," + l + "," + r;
}
// 建树,注意每建立一个结点,i都需要加1,遇到"null"也一样
TreeNode* buildTree(vector<string>& arr, int& i) {
if (i >= arr.size()) return nullptr;
// 通过先序建树
if (arr[i] == "null") {
i++;
return nullptr;
}
int value = stoi(arr[i]);
TreeNode* root = new TreeNode(value);
i++;
root->left = buildTree(arr, i);
root->right = buildTree(arr, i);
return root;
}
// 反序列化
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
// 将data通过","分割成多个string元素,保存在arr中
vector<string> arr;
string str;
for (auto i = 0; i < data.length(); i++) {
if (data[i] == ',') {
arr.push_back(str);
str.clear();
} else {
str.push_back(data[i]);
}
}
// 进行建树,i指向需要建的元素
int i = 0;
return buildTree(arr, i);
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
官方题解:297. 二叉树的序列化与反序列化题解