问题 B: 进击的二叉查找树

时间限制: 1 Sec
内存限制: 64 MB
提交: 1017
解决: 379

题目描述

给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。

输入

每个输入文件中一组数据。

第一行1个正整数N(1<=N<=30),表示二叉查找树中的结点个数。

接下来两行,代表1~N的两个排列。

输出

如果两个排列代表的二叉查找树完全相同,那么输出一行YES,否则输出一行NO。

接下来两行分别输出第一个排列对应的二叉查找树的后序序列、层序序列,整数之间用空格隔开。

每行末尾不允许有多余的空格。

样例输入

5

4 2 1 3 5

4 5 2 3 1

样例输出

YES

1 3 2 5 4

4 2 5 1 3



代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
int pos=0;
int BSTInsert(BiTree *t, int element)
{
if(NULL==*t)
{
(*t)=(BiTree)malloc(sizeof(BiTNode));
(*t)->data=element;
(*t)->lchild=(*t)->rchild=NULL;
return 1;
}
if(element==(*t)->data)
return 0;
if(element<(*t)->data)
return BSTInsert(&(*t)->lchild,element);
return BSTInsert(&(*t)->rchild,element);
}
void CreateBST(BiTree *t, int *a, int n)
{
(*t) = NULL;
for( int i=0; i<n; i++ )
BSTInsert(t,a[i]);
}
void PrintBST(BiTree t, int a[])
{
if(t)
{
PrintBST(t->lchild,a);
PrintBST(t->rchild,a);
a[pos]=t->data;
pos++;
}
}
bool isEqual(BiTree t1, BiTree t2)
{
if(t1==NULL&&t2==NULL)
return true;
else if(t1==NULL||t2==NULL)
return false;
else
{
if(t1->data!=t2->data)
return false;
else
{
bool isEqualLeft,isEqualRight;
isEqualLeft=isEqual(t1->lchild,t2->lchild);
isEqualRight=isEqual(t1->rchild,t2->rchild);
if(isEqualLeft&&isEqualRight)
return true;
else
{
isEqualLeft=isEqual(t1->lchild,t2->rchild);
isEqualRight=isEqual(t1->rchild,t2->lchild);
if(isEqualLeft&&isEqualRight)
return true;
else
return false;
}
}
}
}
void printLevel(BiTree t, int a[], int index)
{
queue<BiTree> q;
if(t!=NULL)
q.push(t);
BiTree b;
while(!q.empty())
{
b=q.front();
a[index]=b->data;
index++;
q.pop();
if(b->lchild)
q.push(b->lchild);
if(b->rchild)
q.push(b->rchild);
}
}
int main()
{
int n;
int *a,*b;
BiTree t1,t2;
scanf("%d", &n);
a=(int*)malloc(sizeof(int)*n);
b=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
CreateBST(&t1,a,n);
CreateBST(&t2,b,n);
if(isEqual(t1,t2))
printf("YES\n");
else
printf("NO\n"); PrintBST(t1,a);
printf("%d",a[0]);
for(int i=1;i<n;i++)
{
printf(" %d",a[i]);
}
printf("\n");
printLevel(t1,a,0);
printf("%d",a[0]);
for(int i=1;i<n;i++)
{
printf(" %d",a[i]);
}
printf("\n");
return 0;
}

codeup模拟赛 进击的二叉查找数的更多相关文章

  1. 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历   二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...

  2. NOIP2018 模拟赛(二十二)雅礼NOI

    Preface 这次的题目都是NOI+的题,所以大家的分数都有点惨烈. 依靠T1大力骗分水到Rank2 所以想看正解的话看这里吧 A. 「雅礼NOI2018模拟赛(一) Day1」树 看一眼题目感觉十 ...

  3. 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历

    二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根 ...

  4. 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治

    LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...

  5. 团体程序设计天梯赛 L3-016. 二叉搜索树的结构

    #include <cstdio> #include <cstdlib> #include <string.h> #include <math.h> # ...

  6. 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告

    点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...

  7. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

  8. EZ 2018 02 28 NOIP2018 模拟赛(二)

    我TM的终于改完了(其实都是SB题) 题目链接:http://211.140.156.254:2333/contest/53 T1送分,T2前40%送分,还有骗分机制在里面,T3暴力50 所以200应 ...

  9. 蓝桥杯模拟赛 引爆炸弹-并查集+DFS

    引爆炸弹 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹, ...

随机推荐

  1. Myeclipse 2014破解教程

    现在很多java编程软件人士大都使用MyEclipse,这软件的强大之处我就不说了,我说下安装步骤与破解步骤,若无JDK则先安装再配置环境变量,这个我就不讲了 工具/原料   MyEclipse安装包 ...

  2. setsockopt()和getsockopt()函数参数

    setsockopt()函数功能介绍 功能描述: 获取或者设置与某个套接字关联的选项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为 ...

  3. HDU 1074 Doing Homework (状态压缩DP)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  4. Just a Hook(区间set)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. Chrome DevTools 开发者工具 技巧 调试

    https://developers.google.com/chrome-developer-tools/docs/tips-and-tricks   1.console面板多行输入 Shift +  ...

  6. 密码学那些事———SHA-512及其C++实现

    SHA-512及其C++实现 转载请注明出处 一.引言 相信大家对于哈希压缩加密算法应该不陌生,在我们用微信或者支付宝接口的时候经常会遇到用这类算法加密,以验证数据的完整性.可以说这类算法无处不在,那 ...

  7. 一些神奇的JS功效

    1: 沉睡排序 var numbers=[1,2,3,4,5,5,99,4,20,11,200]; numbers.forEach((num)=>{ setTimeout(()=>{ co ...

  8. zip 安装mysql 和遇到的坑

    在官网下载了mysql 社区版的,官方网址:https://dev.mysql.com/downloads/mysql/ 解压后发现里面没有安装快捷方式,才知道是zip解压,dos窗口安装.这就比界面 ...

  9. 微信小程序语音识别服务搭建全过程解析(https api开放,支持新接口mp3录音、老接口silk录音)

    silk v3(或新录音接口mp3)录音转olami语音识别和语义处理的api服务(ubuntu16.04服务器上实现) 重要的写在前面 重要事项一: 所有相关更新,我优先更新到我个人博客中,其它地方 ...

  10. C#中访问私有成员

    首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...