首先实现二叉树节点
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class TreeNode {
public:
int val;
TreeNode *left=nullptr;
TreeNode *right=nullptr;
public:
TreeNode(int&& vval){
val = vval;
}
};
反序列化,输入是一个字符串string,输出是一个二叉树的头节点指针
TreeNode* deserilizesub(queue<string>& q){
if (q.empty()) return nullptr; //这里一定要对队列进行非空判断
string cur = q.front();
q.pop();
if(cur=="#") return nullptr;
TreeNode *node = new TreeNode(stoi(cur));
node->left = deserilizesub(q);
node->right = deserilizesub(q);
return node;
}
TreeNode* deserilize(string& data){
queue<string> q;
string tem = "";
for(char c : data){
if(c!=','){
tem+=c;
}else{
q.push(tem);
tem.clear();
}
}
if(!tem.empty()) q.push(tem); //要对未读完的数据接着进行处理
return deserilizesub(q);
}
接着来实现序列化,输入是一颗二叉树的头节点以及待输出的字符串
void serilize(TreeNode *node,string &res){
if(node==nullptr){
res+="#,";//不要忘记逗号
}
else{
res +=to_string(node->val) +",";
serilize(node->left,res);
serilize(node->right,res);
}
}
最后输入进行测试
int main(){
string s;
getline(cin,s);
int n = s.size();
TreeNode *root = deserilize(s);
string res ="";
serilize(root,res);
string newres(res.begin(),res.begin()+n);//这里对序列化之后的结果根据输入进行截断,舍弃多余的#
cout <<newres<<endl;
return 0;
}