题目描述
二叉树被记录为文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化,给定一颗二叉树,请将该二叉树先序序列化和层序序列化。
假设序列化的结果字符串为 str,初始时 str = “”,遍历二叉树时,遇到 null 节点,则在 str 的末尾加上
“#!”,否则加上"当前的节点值!"。 输入描述: 第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root
表示二叉树的根节点。 以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为
0 则表示 fa 没有左儿子,rch同理) 输出描述: 输出两行分别表示该二叉树的先序序列化和层序序列化
示例1
输入
2 1
1 2 0
2 0 0
输出
1!2!#!#!#!
1!2!#!#!#!
#include<bits/stdc++.h>
using namespace std;
struct TreeNode{
TreeNode* left,*right;
int value;
TreeNode(int v):value(v),left(NULL),right(NULL){}
};
map<int,TreeNode*> mp;
void preSerialized(TreeNode*root){
if(root==NULL){
cout<<"#!";
return;
}
else{
cout<<root->value<<"!";
preSerialized(root->left);
preSerialized(root->right);
}
}
void LevelSerialized(TreeNode*root){
if(root==NULL){
cout<<"#!";
return;
}
queue<TreeNode*>q;
q.push(root);
cout<<root->value<<"!";
while(!q.empty()){
TreeNode* cur = q.front();
q.pop();
if(cur->left){
cout<<cur->left->value<<"!";
q.push(cur->left);
}else{
cout<<"#!";
}
if(cur->right){
cout<<cur->right->value<<"!";
q.push(cur->right);
}else{
cout<<"#!";
}
}
}
int main(){
int m,n;
cin>>m>>n;
TreeNode* root= new TreeNode(n);
mp[n] = root;
int fa,lch,rch;
for(int i=0;i<m;i++){
scanf("%d %d %d",&fa,&lch,&rch);
TreeNode*cur;
if(mp.count(fa)==0){
cur = new TreeNode(fa);
mp[fa] = cur;
}else{
cur = mp[fa];
}
if(lch){
TreeNode* l = new TreeNode(lch);
cur->left = l;
mp[lch] = l;
}else{
cur->left = NULL;
}
if(rch){
TreeNode* r = new TreeNode(rch);
cur->right = r;
mp[rch] = r;
}else{
cur->right = NULL;
}
}
preSerialized(root);
cout<<endl;
LevelSerialized(root);
}
需要注意的是层次序列化的时候,必须在每个节点入栈的时候打印,不然会由于栈无法记录空节点而出错。