解题思路
- 序列化:利用先序遍历节点,节点为空时,保存#,节点与节点之间用空格隔开。
- 反序列化:将字符串还原成节点保存至队列中,依次取出节点即可。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) {
if (root == nullptr) return nullptr;
string res = serializeHelper(root);
char* buffer = new char[res.size() + 1];
strcpy(buffer, res.data());
return buffer;
}
TreeNode* Deserialize(char* str){
// 边界条件:当 str 为空时,树为空
if (!str) return nullptr;
queue<TreeNode*> values;
split(str, values);
return reconPreorder(values);
}
private:
string serializeHelper(TreeNode* root){
if (root == nullptr){
return "# ";
}
string res = to_string(root->val) + " ";
res += serializeHelper(root->left);
res += serializeHelper(root->right);
return res;
}
void split(string res, queue<TreeNode*>& values){
istringstream in(res);
string value;
while (in >> value){
if (value == "#"){
values.push(nullptr);
}
else{
values.push(new TreeNode(stoi(value)));
}
}
}
TreeNode* reconPreorder(queue<TreeNode*>& values){
TreeNode* node = values.front(); values.pop();
if (node == nullptr){
return nullptr;
}
TreeNode* head = node;
head->left = reconPreorder(values);
head->right = reconPreorder(values);
return head;
}
};
注意边界条件(参数检查):当字符串为空时,树为空。