題目描述:
請實現兩個函數,分別用來序列化和反序列化二叉樹。
題目解析:
序列化:將一顆二叉樹序列化,以前序遍歷的順序序列化,從根節點開始,將節點的值轉換爲字符,存入一個字符串中,每存一個值,再加上一個',' ,當遍歷到空節點的時候,加上'#'。
反序列化:將一個字符串還原爲一個二叉樹,將字符0-9轉換爲字符 (ch - '0')。轉換爲整型後,創建一個節點其值爲該整型。再遞歸的調用左子樹和右子樹。注意:遞歸的時候要使用char**,否則不能保證每次遞歸後指向字符串的指針會隨遞歸而不斷的移動。
AC代碼:
/*
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 == NULL)
return NULL;
string str;
_Serialize(root,str);
char* ret = new char[str.length()+1];
int i;
for(i = 0;i < str.length();++i)
ret[i] = str[i];
ret[i] = '\0';
return ret;
}
void _Serialize(TreeNode* root,string& str)
{
if(root == NULL)
{
str += '#';
return;
}
string tmp = to_string(root->val);
str += tmp;
str += ',';
_Serialize(root->left,str);
_Serialize(root->right,str);
}
TreeNode* Deserialize(char *str) {
if(str == NULL)
return NULL;
TreeNode* ret = _Deserialize(&str);
return ret;
}
TreeNode* _Deserialize(char** str)
{
if(**str == '#')
{
++(*str);
return NULL;
}
int num = 0;
while(**str != '\0' && **str != ',')
{
num = num*10 + ((**str)-'0');
++(*str);
}
TreeNode* root = new TreeNode(num);
if(**str == '\0')
return root;
else{
//此時的**str=','
++(*str);
root->left = _Deserialize(str);
root->right = _Deserialize(str);
return root;
}
}
};
(*^▽^*)