二叉树的序列化

二叉树的序列化

题目描述:

二叉树被记录为文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化,给定一颗二叉树,请将该二叉树先序序列化和层序序列化。

假设序列化的结果字符串为 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!#!#!#!
备注:

1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^6 1n106

1 ≤ f a , l c h , r c h , r o o t ≤ n 1 \leq fa,lch,rch,root \leq n 1fa,lch,rch,rootn


题解:

序列化就是正常的先序遍历和层次遍历。

代码:
#include <cstdio>
#include <unordered_map>
#include <queue>

using namespace std;

struct BST {
    int val;
    BST *lch, *rch;
    BST(int v) : val(v), lch(NULL), rch(NULL) {}
};

BST *createTree() {
    int n, rt;
    int fa, lch, rch;
    scanf("%d%d", &n, &rt);
    unordered_map<int, BST *> hash;
    BST *new_node = NULL;
    while (n--) {
        scanf("%d%d%d", &fa, &lch, &rch);
        if (!hash.count(fa)) {
            new_node = new BST(fa);
            hash[fa] = new_node;
        }
        if (lch && !hash.count(lch)) {
            new_node = new BST(lch);
            hash[lch] = new_node;
        }
        if (rch && !hash.count(rch)) {
            new_node = new BST(rch);
            hash[rch] = new_node;
        }
        if (lch) hash[fa]->lch = hash[lch];
        if (rch) hash[fa]->rch = hash[rch];
    }
    return hash[rt];
}

void inorder(BST *root) {
    if (!root) {
        printf("#!");
        return;
    }
    printf("%d!", root->val);
    inorder(root->lch);
    inorder(root->rch);
}

void levelorder(BST *root) {
    queue<BST*> q;
    q.push(root);
    while (!q.empty()) {
        auto t = q.front();
        q.pop();
        if (t) {
            printf("%d!", t->val);
            q.push(t->lch);
            q.push(t->rch);
        } else {
            printf("#!");
        }
    }
    puts("");
}

int main(void) {
    BST *root = createTree();
    inorder(root);
    puts("");
    levelorder(root);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值