方法:递归
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); } };