1. 程式人生 > >序列化和反序列化二叉樹

序列化和反序列化二叉樹

  1. 對於序列化:使用前序遍歷,遞迴的將二叉樹的值轉化為字元,並且在每次二叉樹的結點不為空時,在轉化val所得的字元之後新增一個’ , '作為分割。對於空節點則以 ‘#’ 代替。
  2. 對於反序列化:按照前序順序,遞迴的使用字串中的字元建立一個二叉樹

/*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); } };