遍历二叉树,记录每个节点,再以同样的方式遍历就可以还原二叉树
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
#include <string>
class Solution {
public:
void Serializef(TreeNode *root, string& str){
if(!root){ str+="#"; return ; }
string tmp=to_string(root->val);
str += tmp + "!";//!区分节点
Serializef(root->left, str); //左子树
Serializef(root->right, str); //右子树
}
char* Serialize(TreeNode *root) {
if(!root) return "#";//#表示空节点
string res;
Serializef(root, res);
//str转化为char
char* charres=new char[res.length()+1];
strcpy(charres, res.c_str());
charres[res.length()]='\0';
return charres;
}
TreeNode* Deserializef(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=Deserializef(str);
root->right=Deserializef(str);
return root;
}
TreeNode* Deserialize(char *str) {
if(str == "#")return NULL;
TreeNode* res=Deserializef(&str);
return res;
}
};