题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
例如,我们可以把一个只有根节点为1的二叉树序列化为”1,”,然后通过自己的函数来解析回这个二叉树。
解题思路
在序列化的过程中需注意以下几点:
- 遍历过程中遇到空结点,用
'#'补充;
- 每个结点之间用
','隔开;
- 以及在遍历完的序列最后添加,终止符
'\0';
反序列化,即为序列化的逆过程。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| 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) return NULL; SerializeCore (root); int length = str.length(); char* res = new char[length + 1]; for (int i = 0; i < length; i++) { res[i] = str[i]; } res[length] = '\0'; return res; } TreeNode* Deserialize (char* str) { if (!str) return NULL; TreeNode* res = DeserializeCore (&str); return res; } private: string str; void SerializeCore (TreeNode* root) { if (!root) { str += '#'; return; } string temp = to_string(root->val); str += temp; str += ','; SerializeCore (root->left); SerializeCore (root->right); } TreeNode* DeserializeCore (char** str) { if (**str == '#') { (*str)++; return NULL; } int num = 0; while (**str != ',' && **str != '\0') { num = num * 10 + (**str - '0'); (*str)++; } TreeNode* root = new TreeNode(num); if (**str == '\0') return root; else (*str)++; root->left = DeserializeCore (str); root->right = DeserializeCore (str); return root; } };
|
参考博文链接:https://cuijiahua.com/blog/2018/01/basis_61.html