这题是更general一些的二叉树serialization和deserialization,没有了BST里面的大小关系可以依赖,所以需要额外的存储,一种思路是生成两个序列,比如preorder和inorder,一种是存储NULL节点,是得我们可以按顺序或者按数量来以此恢复。因为NULL节点的大小普遍小于真实的node value,或者说存储更方便(任意指定符合即可),所以后者是我们主要使用的方法。
方法一:preorder 深度优先
我们用’#'表示NULL
/**
* 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) {
string res;
serialize_helper(root, res);
return res;
}
void serialize_helper(TreeNode* root, string &res) {
if (!root) {
res += "# ";
return;
}
else {
res += to_string(root->val) + ' ';
serialize_helper(root->left, res);
serialize_helper(root->right, res);
return;
}
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
TreeNode* root;
int i = 0;
deserialize_helper(root, data, i);
return root;
}
void deserialize_helper(TreeNode* &root, string &data, int &i) {
if (i >= data.size() - 1) return;
if (data[i] == ' ') i++;
if (data[i] == '#') {
root = NULL;
i++;
return;
}
string curr;
while (data[i] != ' ') curr += data[i++];
root = new TreeNode(stoi(curr));
deserialize_helper(root->left, data, i);
deserialize_helper(root->right, data, i);
return;
}
};
当然,这里也可以首先把传递的data一次性解析读进数组里,然后依次recursive处理。
方法二:level order 广度优先
/**
* 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) {
string res;
if (!root) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* curr = q.front();
q.pop();
if (curr) {
res += to_string(curr->val) + ' ';
q.push(curr->left);
q.push(curr->right);
}
else {
res += "# ";
}
}
return res;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if (data.size() == 0) return NULL;
int i = 0;
string curr;
while (data[i] != ' ') curr += data[i++];
TreeNode* root = new TreeNode(stoi(curr));
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* t = q.front();
q.pop();
// left child
if (data[i] == ' ') i++;
if (data[i] == '#') {
t->left = NULL;
i++;
}
else {
curr.clear();
while (data[i] != ' ') curr+= data[i++];
TreeNode* left = new TreeNode(stoi(curr));
t->left = left;
q.push(left);
}
// right child
if (data[i] == ' ') i++;
if (data[i] == '#') {
t->right = NULL;
i++;
}
else {
curr.clear();
while (data[i] != ' ') curr+= data[i++];
TreeNode* right = new TreeNode(stoi(curr));
t->right = right;
q.push(right);
}
}
return root;
}
};