序列化和反序列化二叉樹
阿新 • • 發佈:2019-01-01
- 對於序列化:使用前序遍歷,遞迴的將二叉樹的值轉化為字元,並且在每次二叉樹的結點不為空時,在轉化val所得的字元之後新增一個’ , '作為分割。對於空節點則以 ‘#’ 代替。
- 對於反序列化:按照前序順序,遞迴的使用字串中的字元建立一個二叉樹
/*c_str() 功能:c_str 是c++ 中 string類 (class) 的 函式,它能把 string類的物件裡的字串 轉換成 C 中char 型變數 的 字串*/
牛客網ac,坑在返回型別是char*
不是string
class Solution {
public:
void SerializeHelper (TreeNode* root, string &str)
{
if (root == nullptr)
{
str += "#,";
return;
}
str += to_string(root->val);
str += ',';
SerializeHelper(root->left,str);
SerializeHelper(root->right,str);
}
TreeNode* DeserializeHelper(string &str)
{
if (str.empty())return nullptr;
if (str[0] == '#'){//當前字元對應空結點,跳過
str = str.substr(2);
return nullptr;
}
//stoi:string轉int,預設後面出現逗號被截斷,只轉換當前數字字元
TreeNode* p = new TreeNode(stoi(str));
str = str.substr(str.find_first_of(',') + 1);//跳過一個逗號擷取
p->left = DeserializeHelper(str);
p->right = DeserializeHelper(str);
return p;
}
char* Serialize(TreeNode *root) {
if (!root)return NULL;
string str("");
SerializeHelper(root, str);
char* res = new char[str.size()+1];
strcpy(res, str.c_str());
return res;
}
TreeNode* Deserialize(char *str) {
if (str == nullptr)return nullptr;
string s(str);
return DeserializeHelper(s);
}
};