剑指offer37-AcWing-50. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
你可以序列化如下的二叉树
8
/ \
12 2
/ \
6 4
为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"
注意:
以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。
思路:
序列化的时候:前序遍历链表,然后把结点信息依次放入res字符串中,包括NULL结点,然后结点之间用‘,’逗号隔开。
反序列话的时候:递归遍历字符串,用now来记录字符串此时遍历的位置,若遍历到null的时候,跳过,直接返回NULL;now长度已经大于字符串的长度的时候,也直接返回NULL;否则创建该结点,然后依次遍历其左右子树的结点。
c++ code:
/**
* 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:
void serializeCore(TreeNode* root, string &res){
if(root == NULL){
res += "null,";
return;
}
res += to_string(root->val) + ',';
serializeCore(root->left, res);
serializeCore(root->right, res);
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res = "";
serializeCore(root, res);
return res;
}
TreeNode* deserializeCore(string data, int &now){
if(now >= data.length()){
return NULL;
}
if(data[now] == 'n'){
now += 5;
return NULL;
}
int num = 0;
while(data[now] != ','){
num = num * 10 + data[now] - '0';
now++;
}
now++;
TreeNode* root = new TreeNode(num);
root->left = deserializeCore(data, now);
root->right = deserializeCore(data, now);
return root;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int now = 0;
return deserializeCore(data, now);
}
};