二叉树的序列化
题目描述:
二叉树被记录为文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化,给定一颗二叉树,请将该二叉树先序序列化和层序序列化。
假设序列化的结果字符串为 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 1≤n≤106
1 ≤ f a , l c h , r c h , r o o t ≤ n 1 \leq fa,lch,rch,root \leq n 1≤fa,lch,rch,root≤n
题解:
序列化就是正常的先序遍历和层次遍历。
代码:
#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;
}