劍指offer之序列化二叉樹
阿新 • • 發佈:2018-12-16
1.題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹。 兩個函式分別是:
char* Serialize(TreeNode *root) {
}
TreeNode* Deserialize(char *str) {
}
2.問題分析
系列化和反系列化都應該是一樣的遍歷方式,或者前序遍歷或者中序遍歷或者後序遍歷。但是為了方便,我們使用前序遍歷,第一個字元就是根節點。 序列化的時候,空節點我們使用’#‘來標誌,val直接我們使用’,'來分割。 反系列化的時候,因為遞迴的時候,str的值要相應改變,要麼使用char* &str或者char** str。 具體過程看程式碼。
3.原始碼
char* Serialize(TreeNode *root) {
if(root == NULL)
return "#";
string value = to_string(root->val);
value.push_back(',');
char* left = Serialize(root->left);
char* right = Serialize(root->right);
//合併字串
char* res = new char[strlen(left) + strlen(right) + value.size()];
strcpy(res,value.c_str());
strcat(res,left);
strcat(res,right);
return res;
}
TreeNode* decode(char* &str)
{
if(*str == '#')
{
++str;
return NULL;
}
int num = 0;
while(*str != ',')
num = 10 * num + *str++ - '0';
//跳過字元','
++str;
TreeNode* root = new TreeNode(num);
root->left = decode(str);
root->right = decode(str);
return root;
}
TreeNode* Deserialize(char *str) {
return decode(str);
}