AcWing 50. 序列化二叉树
宋标 Lv5

题目

请实现两个函数,分别用来序列化和反序列化二叉树。

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

数据范围

树中节点数量

样例

你可以序列化如下的二叉树
    8
   / \
  12  2
     / \
    6   4

为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"

注意:

  • 以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。

题解

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/

#define N 1010

using namespace std;

class Solution {
public:

string tree_seri;
int pr_or[N], in_or[N];
int cnt;

void set(int num)
{
if (!num) return;
set(num / 10);
if (num < 0) num *= -1;
tree_seri += num % 10 + '0';
}

void order(TreeNode* root, bool pre)
{
if (!root) return;

if (!pre) order(root -> left, pre);

int &v = root -> val;
if (!v) tree_seri += '0';
else
{
if (v < 0) tree_seri += '-';
set(v);
}
tree_seri += ",";

if (pre) order(root -> left, pre);

order(root -> right, pre);
}

// Encodes a tree to a single string.
string serialize(TreeNode* root) {

if (!root) return "";

order(root, true);
tree_seri[tree_seri.size() - 1] = '|';
order(root, false);
tree_seri[tree_seri.size() - 1] = '\0';

return tree_seri;
}



void arr_set(int begin, int end, int arr[])
{
bool neg = false;
for (int i = begin; i < end; ++ i)
{
if (tree_seri[i] == ',')
continue;
if (tree_seri[i] == '-')
{
neg = true;
continue;
}

int sum = 0;
while (tree_seri[i] >= '0' && tree_seri[i] <= '9')
{
sum += tree_seri[i] - '0';
sum *= 10;
++ i;
}
-- i;

if (neg) sum *= -1, neg = false;
arr[cnt ++] = sum / 10;
}
}

map<int,int> hash;

TreeNode* dfs(int pl, int pr, int il, int ir)
{
if (pl > pr) return nullptr;
auto *root = new TreeNode(pr_or[pl]);
int k = hash[pr_or[pl]];
root -> left = dfs(pl + 1, pl + k - il, il, k - 1);
root -> right = dfs(pl + k - il + 1, pr, k + 1, ir);
return root;
}

// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {

if (data == "") return nullptr;

tree_seri = data;

int begin = 0, end = 0;
while (data[end] != '|') ++ end;

arr_set(begin, end, pr_or); cnt = 0;
arr_set(end + 1, data.size() - 1, in_or);

for (int i = 0; i < cnt; ++ i) hash[in_or[i]] = i;
return dfs(0, cnt - 1, 0, cnt - 1);
}
};
 评论