PROBLEM

剑指 Offer 37. 序列化二叉树

难度 困难

MY ANSWER

  • 队列实现bfs,使用to_string来实现int到string的转换,从而实现二叉树的序列化。
  • 首先使用循环与substr对字符串进行分割,储存到string向量中。同样使用队列实现二叉树的构建,从队头中取节点添加儿子节点,将儿子节点入队。同时遍历string向量,index指示当前节点对应的儿子节点的值,构建节点使用stoi将字符串转换为int。
  • 时间复杂度O(n),空间复杂度O(n)。
/**
* 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:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
if(!root) {
return "[]";
}
string str = "[";
queue<TreeNode*> bfs;
bfs.push(root);
int cnt = 0;
while(bfs.size()) {
cnt++;
TreeNode* tmp = bfs.front();
if(tmp) {
str += to_string(tmp->val) + ",";
bfs.push(tmp->left);
bfs.push(tmp->right);
}
else {
str += "null,";
}
bfs.pop();
}
str[str.length() - 1] = ']';
//cout<<str<<endl;
return str;
}

// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
TreeNode* root = NULL;
if(!data.compare("[]")) {
return root;
}
vector<string> seq;
int start = 1, end = 1;
for(int i = 1; i < data.length(); i++) {
if(data[i] == ',' || data[i] == ']') {
end = i;
seq.push_back(data.substr(start, end - start));
start = end + 1;
}
}
// for(int i = 0; i < seq.size(); i++) {
// cout<<seq[i]<<endl;
// }
root = new TreeNode(stoi(seq[0]));
queue<TreeNode*> bfs;
bfs.push(root);
int index = 1;
while(index < seq.size() && bfs.size()) {
TreeNode* tmp = bfs.front();
if(!tmp) {
bfs.pop();
continue;
}
if(seq[index].compare("null")) {
tmp->left = new TreeNode(stoi(seq[index]));
}
else {
tmp->left = NULL;
}
bfs.push(tmp->left);
index++;
if(seq[index].compare("null")) {
tmp->right = new TreeNode(stoi(seq[index]));
}
else {
tmp->right = NULL;
}
bfs.push(tmp->right);
index++;
bfs.pop();
}
return root;
}
};

// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));

BETTER SOLUTION

思路相同。

SUMMARY

bfs实现对树的层序遍历,注意to_string、stoi、substr这几个库函数的调用。