【刷题】牛客CD163-二叉树的序列化

题目描述

二叉树被记录为文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化,给定一颗二叉树,请将该二叉树先序序列化和层序序列化。
假设序列化的结果字符串为 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);
}

需要注意的是层次序列化的时候,必须在每个节点入栈的时候打印,不然会由于栈无法记录空节点而出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值