【剑指Offer】【树】序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: //序列化 void do_Serialize(TreeNode *root, string &s) { if(root == nullptr) { s += '#'; s += ','; return; } //std::to_string() 数值转换字符串 s += to_string(root->val); s += ','; do_Serialize(root->left,s); do_Serialize(root->right,s); } char* Serialize(TreeNode *root) { if(root == nullptr) { return nullptr; } string str = ""; do_Serialize(root,str); //返回值是char * char *ret = new char[str.length() + 1]; //'\0' strcpy(ret, str.c_str()); return ret; } //反序列化 TreeNode* do_Deserialize(string &s) { if(s.empty()) { return nullptr; } if (s[0] == '#') { s = s.substr(2); //从s中去掉#, return nullptr; } TreeNode *ret = new TreeNode(stoi(s)); s = s.substr(s.find_first_of(',') + 1); ret->left = do_Deserialize(s); ret->right = do_Deserialize(s); return ret; } TreeNode* Deserialize(char *str) { if(str == nullptr) { return nullptr; } string s(str); return do_Deserialize(s); } };