61、剑指offer--序列化二叉树

题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
 
解题思路:序列化的时候,遇到无子结点,则填#来占位;对于反序列化时,每次遇到#返回空
 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 Serialize(TreeNode *root, string &str)
14     {
15         if(root == NULL)
16         {
17             str += '#';//用#代表null
18             return;//返回上一层
19         }
20         else
21         {
22             string r = to_string(root->val);//值转字符串
23            str += r;//字符串拼接
24            str += ',';//数字后用,进行节点分隔
25            Serialize(root->left,str);
26            Serialize(root->right,str);
27         }
28     }
29     char* Serialize(TreeNode *root) {
30         if(root == NULL)
31             return NULL;
32         string str;
33         Serialize(root, str);
34         //字符串转char *
35         char *ret = new char[str.length()+1];
36         for(int i=0;i<str.length();i++)
37         {
38             ret[i] = str[i];
39         }
40         ret[str.length()] = '\0';
41         return ret;
42     }
43     TreeNode *deserialize(char **str)
44     {
45         if(**str == '#')//空的时候返回
46         {
47             ++(*str);
48             return NULL;
49         }
50         int num = 0;
51         while(**str != '\0' && **str != ',')
52         {
53             num = num*10 + ((**str) - '0'); //求出每个节点的值
54             ++(*str);
55         }
56         TreeNode *root = new TreeNode(num);
57         if(**str == '\0')
58             return root;
59         else
60             (*str)++;//跨过','
61         root->left = deserialize(str);
62         root->right = deserialize(str);
63         return root;
64     }
65     TreeNode* Deserialize(char *str) {
66         if(str == NULL)
67             return NULL;
68         TreeNode *res = deserialize(&str);
69         return res;
70     }
71 };

 

posted @ 2017-07-05 20:02  qqky  阅读(137)  评论(0编辑  收藏  举报