C++ 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
string str;
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
dfs(root);
return str;
}
// 使用前序遍历序列化二叉树
void dfs(TreeNode* root)
{
if(root == nullptr) // 如果当前为空结点,那么将其序列化为 null;
{
str += "null ";
return;
}
else // 当前不为空结点时,将结点中的值序列化为相应的值
str += (to_string(root->val) + ' ');
dfs(root->left); // 递归处理左子树
dfs(root->right); // 递归处理右子树
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int cur = 0;
return d_dfs(data, cur);
}
TreeNode* d_dfs(string data, int& cur)
{
if(cur >= data.size()) return nullptr; // 字符串解析完毕,直接返回null;
// 解析不同结点的字符串区间
int c = cur; // 根节点字符串的区间[cur, c - 1]
while(c < data.size() && data[c] != ' ') c++;
if(data[cur] == 'n')
{
cur = c + 1; // 当前为空结点,直接跳过处理下一个结点。
return nullptr;
}
else
{
auto root = new TreeNode(-1);
int val = 0; // 处理正负数
if(data[cur] == '-')
{
for(int i = cur + 1; i < c; ++i) val = val * 10 + data[i] - '0';
val = -val;
}
else
for(int i = cur; i < c; ++i) val = val * 10 + data[i] - '0';
root->val = val;
// 递归处理左子树,右子树
cur = c + 1;
root->left = d_dfs(data, cur);
root->right = d_dfs(data, cur); // 在处理右子树的时候,cur 已经被改变过了(左子树 null 那一步改变的)
return root;
}
}
};
// 总结:本答案使用 "前序遍历" 序列化
// 本题难点在于对序列化后的字符串进行解析操作。对二叉树序列化的时候将空结点进行了 null 标记,这样才使得我们
// 可以利用一个序列构造出二叉树,因此,我们只需严格的按照 "根,左,右" 的方式一个值一个值(包括 null)来构建出
// 完整的二叉树。
// 实现细节: 在构建过程中由于全局只需要一个指针,利用指针严格的依次解析每一个值,因此我们对指针的传递使用引用传递。
11