Day-17 297. 二叉树的序列化与反序列化

297. 二叉树的序列化与反序列化

题目

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
序列化是将一个数据结构或者对象转换为连续的比特位的操作,

进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,

采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。

这里不限定你的序列 / 反序列化算法执行逻辑,

你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示: 输入输出格式与 LeetCode 目前使用的方式一致,

详情请参阅 LeetCode 序列化二叉树的格式。

你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

示例 1

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

示例 2

输入:root = []
输出:[]

示例 3

输入:root = [1]
输出:[1]

示例 4

输入:root = [1,2]
输出:[1,2]
 

提示:

树中结点数在范围 [0, 104] 内
-1000 <= Node.val <= 1000

题目思路

  • 1、本质上还是 DFS 与 BFS 题目,但是此题目难度较大,所以花费时间较长。
  • 2、dfs 有两种形式前序 dfs,后面还有后序 dfs,后序遍历因为时间限制,暂时不去写,而中序由于无法确定根节点,所以无法形成递归形式

代码块。

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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
/* void predfs(TreeNode* root, string& data)
{
if(root == nullptr) data += "null,";
else
{
data += to_string(root -> val) + ",";
predfs(root -> left, data);
predfs(root -> right, data);
}
}

string serialize(TreeNode* root)
{
string data;
predfs(root, data);
return data;
}

TreeNode* rdfs(list<string>& str)
{
if (str.front() == "null")
{
str.erase(str.begin());
return nullptr;
}
TreeNode* root = new TreeNode(stoi(str.front()));
str.erase(str.begin());
root -> left = rdfs(str);
root -> right = rdfs(str);
return root;
}

TreeNode* deserialize(string data)
{
list<string> str;
string s;
for (auto& ch : data)
{
if (ch == ',')
{
str.push_back(s);
s.clear();
}
else s.push_back(ch);
}
if (s.empty() != 0)
{
str.push_back(s);
s.clear();
}
return rdfs(str);
} */
string serialize(TreeNode* root) {
string ans;
queue<TreeNode* > q;
if(root == nullptr) return ans;
else q.push(root);
while(!q.empty())
{
int n = q.size();
for(int i = 0; i < n; ++i){
auto node = q.front();
q.pop();
if(node == nullptr) ans += "null,";
else
{
ans += to_string(node->val) + ",";
q.push(node->left);
q.push(node->right);
}
}
}
return ans;
}
TreeNode* deserialize(string data) {
if(data.empty()) return NULL;
vector<TreeNode* > ans;
int k = 0;
int n = data.size();
while(k < n)
{
string tmp;
while(data[k] != ',')
{
tmp += data[k];
k++;
}
if(tmp == "null") ans.push_back(NULL);
else ans.push_back(new TreeNode(stoi(tmp)));
tmp.clear();
k++;
}
int pos = 1;
for(int i = 0; i < ans.size(); i++)
{
if(ans[i] == NULL) continue;
ans[i] -> left = ans[pos++];
ans[i] -> right = ans[pos++];
}
return ans[0];
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));

复杂度

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)


Day-17 297. 二叉树的序列化与反序列化
https://chaggle.github.io/2021/09/26/Leetcode/91-day/day-17/
作者
chaggle
发布于
2021年9月26日
许可协议