题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
你可以序列化如下的二叉树
8
/ \
12 2
/ \
6 4
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"
注意:
- 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。
分析:
完全模拟前序遍历,在前序遍历递归的算法下修改实现方式。
/**
* 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:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string s;
dfs_s(root,s);
return s;
}
void dfs_s(TreeNode* root,string &s){
if(!root){
s += "null ";
return;
}
s += to_string(root->val) + ' ';
dfs_s(root->left,s);
dfs_s(root->right,s);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int u = 0;
return dfs_t(data,u);
}
TreeNode* dfs_t(string s,int &u){
if(u == s.size()) return NULL;
int k = u;
while(s[k] != ' ') k++;
if(s[u] == 'n'){
u = k + 1;
return NULL;
}
int val = 0;
for(int i = u;i < k;i++) val = val * 10 + s[i] - '0';
u = k + 1;
auto root = new TreeNode(val);
root->left = dfs_t(s,u);
root->right = dfs_t(s,u);
return root;
}
};