题目来源:力扣《剑指Offer》第二版
完成时间:2022/08/10
文章目录
37. 序列化二叉树
题目链接:剑指 Offer 37. 序列化二叉树 - 力扣(LeetCode)
我的题解
这道题代码有点多,但是不难理解。书上用的是前序遍历的方式生成字符串序列,最后还原二叉树还要递归不好理解。这里不妨用层次遍历来做。
首先是生成序列,层次遍历二叉树,遇到正常节点就在字符串后面加上“节点值,”,若子节点位空就加上“*,”。
反序列的时候,可以先将字符串中的值按","分割成数组。根据数组,再自顶向下层次生成二叉树即可。
/**
* 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 traverse(TreeNode* node,string& answer) {
if(node == nullptr) return;
queue<TreeNode*> que;
que.push(node);
answer += to_string(node->val) + ",";
while(!que.empty()) {
TreeNode* tmp = que.front();
que.pop();
if(tmp->left){
que.push(tmp->left);
answer += to_string(tmp->left->val) + ",";
}
else answer += "*,";
if(tmp->right) {
que.push(tmp->right);
answer += to_string(tmp->right->val) + ",";
} else answer += "*,";
}
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string tree = "";
traverse(root,tree);
return tree;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data == "") return NULL;
int pos = 0;
int indexOfdot = 0;
vector<string> treeVec;
while(pos != data.size()){
indexOfdot = data.find(",",pos);
string str = data.substr(pos,(indexOfdot-pos));
treeVec.push_back(str);
pos = indexOfdot + 1;
}
pos = 0;
TreeNode* head = new TreeNode(atoi(treeVec[0].c_str()));
queue<TreeNode*> que;
que.push(head);
while(!que.empty()) {
int size = que.size();
TreeNode* tmp = NULL;
for(int i = 1;i <= size;i++) {
tmp = que.front();
que.pop();
if(treeVec[pos+1] != "*") {
tmp->left = new TreeNode(atoi(treeVec[pos+1].c_str()));
que.push(tmp->left);
}
if(treeVec[pos+2] != "*") {
tmp->right = new TreeNode(atoi(treeVec[pos+2].c_str()));
que.push(tmp->right);
}
pos += 2;
}
}
return head;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));