老规矩咯:
参考:东哥带你刷二叉树(序列化篇) | 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));
层次遍历: 明天续更,干饭去了,家人们