题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树
思路分析:
这里一开始有点不明白题目的意思。实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式。而反序列就是将之前生成的序列转化成二叉树。
常规的想法里面,编码二叉树无非就是前序、中序、后序或是层次,但是我们都直到前序遍历加上中序遍历才能确定一颗二叉树,所以需要引入一些额外的信息,对于空的指针有表示。
下面的代码当中,是利用了前序遍历来序列化二叉树,其中对于空指针用‘#'表示,且每个结点后会用','隔开。注意二叉树的值为整数,可能包含多位,因此转化为二叉树时,需要将字符串转化为整型。
代码:
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solution { 12 public: 13 void SerializeCore(TreeNode* root, string &str) 14 { 15 if(!root) 16 { 17 str += '#'; 18 return; 19 } 20 string tmp = to_string(root->val); 21 tmp += ','; 22 str += tmp; 23 SerializeCore(root->left, str); 24 SerializeCore(root->right, str); 25 } 26 char* Serialize(TreeNode *root) { 27 if(!root) 28 return nullptr; 29 string str; 30 SerializeCore(root, str); 31 int len = str.length(); 32 char* res = new char[len+1]; 33 for(int i=0; i<str.length(); i++) 34 { 35 res[i] = str[i]; 36 } 37 res[len] = '