leetcode 二叉树的序列化与反序列化 困难
序列化方式参考:https://www.cnblogs.com/rookie-acmer/p/15208399.html
即:null 结点用 # 号表示,并且用英文逗号 ',' 进行分割
然后就是还原建树的问题:如果能对左儿子进行建树,就对左儿子建树;不能,则对右儿子建树;
class Codec { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { string treeStr; doSerialize(root, treeStr); return treeStr; } // Decodes your encoded data to tree. TreeNode* deserialize(const string& data) { int i = 0; return doDeserialize(data, i); } private: string intToStr(int val) { if(val == 0) return "0"; int flag = val < 0; deque<char> deq; val = abs(val); while(val) { deq.push_front(val % 10 + '0'); val /= 10; } if(flag) deq.push_front('-'); return string(deq.begin(), deq.end()); } void doSerialize(TreeNode *root, string &treeStr) { if(!root) { treeStr.push_back('#'); treeStr.push_back(','); return; } treeStr += intToStr(root -> val); treeStr.push_back(','); doSerialize(root -> left); doSerialize(root -> right); } TreeNode *doDeserialize(const string& data, int &i) { // 注意 i 是引用类型 if(data[i] == '#') return nullptr; TreeNode *root = new TreeNode; int val = 0; int flag = false; if(data[i] == '-') { flag = true; ++ i; } while(i < data.size() && data[i] != ',') { val = val * 10 + (data[i] - '0'); ++ i; } root -> val = flag ? -val : val; // i 在逗号的位置 ++ i; root -> left = doDeserialize(data, i); // i 在 # 的位置 i += 2; root -> right = doDeserialize(data, i); return root; } };