老规矩咯:
参考:东哥带你刷二叉树(序列化篇) | labuladong 的算法笔记
建议先过一遍:今天是二叉树~-CSDN博客,very重要!
然后再过一遍(理解怎么应用方法):保研机试之[三道二叉树习题,思路为主]-CSDN博客
然后再过一遍(了解后序思路) :保研机试之【构造二叉树】-CSDN博客
来到今天的小剧场:297. 二叉树的序列化与反序列化 - 力扣(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:
string res="";
void ser(TreeNode* root){
if(root==nullptr){
res+="#,";
return;
}
//前
res+=to_string(root->val);
res+=",";
ser(root->left);
//中
ser(root->right);
//后
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
ser(root);
cout<<res<<endl;
return res;
}
vector<string> temp;
void deal(string data){
stringstream ss(data);
string item;
while(getline(ss,item,',')){
temp.push_back(item);
}
}
int cnt=0;
TreeNode* des(int len){
//前
if(temp[cnt]=="#"){cnt++;return nullptr;}
TreeNode* node=new TreeNode;
node->val=stoi(temp[cnt++]);
TreeNode* left=des(len);
//中
TreeNode* right=des(len);
//后
node->left=left;
node->right=right;
return node;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
deal(data);
int len=temp.size();
TreeNode* result=des(len);
return result;
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));
层次遍历: 字符串转二叉树的时候,将二叉树结点入队(包括空指针),再设置一个idx用于记录当下遍历到的二叉树结点的左右孩子的位置;每当pop一个二叉树结点时,就要给他分配左右孩子,并且将左右孩子入队。
/**
* 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:
string res="";
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
TreeNode* head=root;
if(root==nullptr){res+="#,";return res;}
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* temp=q.front();
if(temp==nullptr){res+="#,";q.pop();continue;}
else{res+=to_string(temp->val);res+=",";}
q.pop();
q.push(temp->left);
q.push(temp->right);
}
//cout<<res<<endl;
return res;
}
vector<string> temp;
void deal(string data){
stringstream ss(data);
string item;
while(getline(ss,item,',')){
temp.push_back(item);
}
}
TreeNode* des(){
int len=temp.size();
if(len==1 && temp[0]=="#"){return nullptr;}
TreeNode* root=new TreeNode;
int idx=0;
root->val=stoi(temp[idx++]);
//cout<<root->val<<endl;
queue<TreeNode*> q;
q.push(root);
for(int i=0;i<len;i++){
TreeNode* t=q.front();
q.pop();
//cout<<q.size()<<endl;
if(t==nullptr){continue;}
if(temp[idx]=="#"){TreeNode* left=nullptr;idx++;q.push(left);t->left=left;}
else{
TreeNode* left=new TreeNode;
left->val=stoi(temp[idx++]);
q.push(left);
t->left=left;
}
if(temp[idx]=="#"){TreeNode* right=nullptr;idx++;q.push(right);t->right=right;}
else{
TreeNode* right=new TreeNode;
right->val=stoi(temp[idx++]);
q.push(right);
t->right=right;
}
}
return root;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
deal(data);
TreeNode* ans=des();
return ans;
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));