Description:
题目大意:将二叉树序列号然后反序列化
解题思路:
算法标签:BFS,层序遍历
代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
// 层序遍历
char* Serialize(TreeNode *root) {
string ret;
if(root == NULL)
return nullptr;
queue<TreeNode*>q;
q.push(root);
// 数值转换为字符串,记录节点的值
ret += to_string(root -> val) + '!';
while(!q.empty()) {
// 取队列头节点
TreeNode* head = q.front();
q.pop();
if(head -> left != nullptr) {
ret += to_string(head -> left -> val) + '!';
q.push(head -> left);
}
else
ret += '#';
if(head -> right != nullptr) {
ret += to_string(head -> right -> val) + '!';
q.push(head -> right);
}
else
ret += '#';
}
char* ans = new char[ret.size() + 1];
strcpy(ans,ret.c_str());
return ans;
}
TreeNode* Deserialize(char *str) {
if(str == nullptr)
return nullptr;
// 预处理建树
string s = string(str);
vector<string>tree;
for(int i = 0;i < s.size();i++) {
if(s[i] == '#')
tree.push_back("#");
else {
int j = i;
while(s[j] != '!')
j++;
tree.push_back(s.substr(i , j - i));
i = j;
}
}
// stoi() 函数可以将 string 转化为 int
// 创造根节点
TreeNode* root = new TreeNode(stoi(tree[0]));
queue<TreeNode*>q;
q.push(root);
for(int i = 1;i < tree.size();i += 2) {
TreeNode* head = q.front();
q.pop();
TreeNode* l = nullptr;
TreeNode* r = nullptr;
// 左子树非空
if(tree[i] != "#") {
l = new TreeNode(stoi(tree[i]));
q.push(l);
}
head -> left = l;
// 右子树非空
if(tree[i + 1] != "#") {
r = new TreeNode(stoi(tree[i + 1]));
q.push(r);
}
head -> right = r;
}
return root;
}
};