剑指offer 序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树
 
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
 
 
 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 private:
13     void Serialize(TreeNode *root, string &s) {
14         if (root == NULL) {
15             s += '#';
16             return ;
17         }
18         string tmp = to_string(root->val);
19         s += tmp;
20         s += '!';
21         Serialize(root->left, s);
22         Serialize(root->right, s);
23         //return s;
24     }
25     TreeNode* Deserialize(char **str) {
26         if (**str == '#') {
27             (*str)++;
28             return NULL;
29         }
30         int num = 0;
31         while (**str != '\0' && **str != '!') {
32             num = num * 10 + (**str - '0');
33             (*str)++;
34         }
35         TreeNode* root = new TreeNode(num);
36         if (**str == '\0') {
37             return root;
38         } else {
39             (*str)++;
40         }
41         root->left = Deserialize(str);
42         root->right = Deserialize(str);
43         return root;
44     }
45 public:
46     char* Serialize(TreeNode *root) {   
47         if (root == NULL)
48             return NULL;
49         string s;
50         Serialize(root, s);
51          
52         int i = 0, len = s.length();
53         char *c = new char[len + 1];
54         for (i = 0; i < len; i++) {
55             c[i] = s[i];
56         }
57         c[i] = '\0';
58         return c;
59     }
60     TreeNode* Deserialize(char *str) {
61         if (str == NULL)
62             return NULL;
63         return Deserialize(&str);
64     }
65      
66 };

 

posted @ 2019-08-20 10:30  琴影  阅读(173)  评论(0编辑  收藏  举报