方法:递归
1、利用递归得到二叉树的前序遍历;
2、将前序遍历转换为二叉树。
代码中有很多细节需要处理:string和char类型之间的转换,字符与数字之间的转换。
时间复杂度:o(n)
空间复杂度:o(n)
class Solution {
public:
//前序遍历
void SerializeFunction(TreeNode* root, string& str) {
//空结点处理
if (root == nullptr) {
str += '#';
return;
}
string temp = to_string(root->val);
str += temp + '!'; //区分结点
//左子树
SerializeFunction(root->left, str);
//右子树
SerializeFunction(root->right, str);
}
char* Serialize(TreeNode* root) {
string res;
SerializeFunction(root, res);
//string转换为char
char* charRes = new char[res.length() + 1]; //最后一个以'\0'结尾
strcpy(charRes, res.c_str());
charRes[res.length()] = '\0';
return charRes;
}
TreeNode* DeserializeFunction(char** str) {
if (**str == '#') {
(*str)++;
return NULL;
}
//数字转换
int val = 0;
while (**str != '!' &&** str != '\0') {
val = val * 10 + ((**str) - '0');
(*str)++;
}
TreeNode* root = new TreeNode(val);
//序列到底了,构建完成
if (**str == '\0')
return root;
else
(*str)++;
//反序列化与序列化一致,都是前序
root->left = DeserializeFunction(str);
root->right = DeserializeFunction(str);
return root;
}
TreeNode* Deserialize(char* str) {
return DeserializeFunction(&str);
}
};

京公网安备 11010502036488号