【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树
L3-016. 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 2 4 1 3 0 }插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。
输入格式:
输入在第一行给出一个正整数N(<= 100)【根据Time的先后次序进行建树,可以将数组大小大大压缩到200即可,Time表示其建立时的时间次序,lson和rson表示其左右节点建立的时间】,随后一行给出N个互不相同的整数,数字间以空格分隔,要求将之顺次插入一棵初始为空的二叉搜索树。之后给出一个正整数M(<= 100),随后M行,每行给出一句待判断的陈述句。陈述句有以下6种:
- 1、"A is the root",即"A是树的根";
- 2、"A and B are siblings",即"A和B是兄弟结点";
- 3、"A is the parent of B",即"A是B的双亲结点";
- 4、"A is the left child of B",即"A是B的左孩子";
- 5、"A is the right child of B",即"A是B的右孩子";
- 6、"A and B are on the same level",即"A和B在同一层上"。
- 【注意观察,其实是有规律的!只有2和4的第二个单词是“and”——第二个单词开头不同;排除2和4后,1/3/4/5的第四个单词都不相同,值得注意的是“root”和“right”的第一个单词相同,所以需要判断两位!】
题目保证所有给定的整数都在整型范围内。
输出格式:
对每句陈述,如果正确则输出“Yes”,否则输出“No”,每句占一行。
输入样例:
5
2 4 1 3 0
8
2 is the root
1 and 4 are siblings
3 and 0 are on the same level
2 is the parent of 4
3 is the left child of 4
1 is the right child of 2
4 and 0 are on the same level
100 is the right child of 3 【这个100需要特别关注一下!!题目说的数据要求在整形范围内,所以需要考虑这种不在二叉搜索树中的超大数据的特殊情况,需要加以特殊判断!!】
AC题解:
其实跟二叉树也没啥区别,就是在建树时按照左小右大的顺序来建立的!链表其实更好,有必要学学!
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<string>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
#define N 308 //需要多开一倍,在出现斜二叉树的情况下
#define ll long long
struct node{
int data;
int level;
int lson,rson;
node(int data=inf,int level=-,int lson=-inf,int rson=-inf):data(data),level(level),lson(lson),rson(rson){}
}a[N];
int Time; void BST_insert(int i,int val,int level){//i表示需要插入的节点的编号
if(a[i].data==inf){//表示当前数据需要插入的位置
a[i]=node(val,level,+Time,+Time);
Time+=;
return ;
}
if(val>a[i].data){//大的向右边
BST_insert(a[i].rson,val,level+);
}else if(val<a[i].data){//小的向左边
BST_insert(a[i].lson,val,level+);
}
}
int fact_siblings(int i,int x,int y){//判断x,y是否是兄弟节点
if(a[i].data!=inf){
if(a[a[i].lson ].data!=inf){//保证当前节点i 一定有两个子节点
if( a[a[i].lson ].data==x&&a[a[i].rson].data==y)
return ;
if( a[a[i].lson ].data==y&&a[a[i].rson].data==x)
return ;
}
return fact_siblings(a[i].lson,x,y)||fact_siblings(a[i].rson,x,y);
}
return ;
}
int fact_level(int i,int x){
if(a[i].data==inf)return -;
if(a[i].data!=x){
int ans1,ans2;
if(ans1=fact_level(a[i].rson,x),ans1!=-)
return ans1;
if(ans2=fact_level(a[i].lson,x),ans2!=-)
return ans2;
}
else{
return a[i].level;
}
return -;//找不到的情况
}
int fact_pa(int i,int x,int y){//枚举每个双亲节点,判断x是y的双亲节点
if(a[i].data==inf)
return ;
if(a[i].data!=x){
return fact_pa(a[i].lson,x,y)||fact_pa(a[i].rson,x,y);
}
else{
int l=a[i].lson,r=a[i].rson;
if(a[l].data==y||a[r].data==y)return ;
else return ;
}
return ;
}
int fact_left(int i,int x,int y){//枚举每个双亲节点,判断x是y的左节点?
if(a[i].data==inf)return ;
if(a[i].data==y){
if(a[a[i].lson].data==x)return ;
else return ;
}else{
return fact_left(a[i].lson,x,y)||fact_left(a[i].rson,x,y);
}
return ;
}
int fact_right(int i,int x,int y){//判断x是y的右节点否?
if(a[i].data==inf)return ;
if(a[i].data==y){
if(a[a[i].rson].data==x)return ;
else return ;
}else{
return fact_right(a[i].lson,x,y)||fact_right(a[i].rson,x,y);
}
return ;
}
void solve(int m){
int x,y;
char ch[];
for(int i=;i<=m;i++){
scanf("%d",&x);
scanf("%s",ch);
if(ch[]=='a'){//兄弟节点或者在同一层上
scanf("%d%*s%s",&y,ch);
if(ch[]=='s'){
if(fact_siblings(,x,y))printf("Yes\n");
else printf("No\n");
}else{
scanf("%s%*s%*s",ch);
if(fact_level(,x)==-||fact_level(,y)==-)
printf("No\n");
else if(fact_level(,x)==fact_level(,y))printf("Yes\n");
else printf("No\n");
}
}
else{
scanf("%*s%s",ch);
if(ch[]=='r'&&ch[]=='o'){
if(a[].data==x)printf("Yes\n");
else printf("No\n");
}
else if(ch[]=='p'){
scanf("%*s%d",&y);
if(fact_pa(,x,y))printf("Yes\n");
else printf("No\n");
}
else if(ch[]=='l'){
scanf("%*s%*s%d",&y);
if(fact_left(,x,y))printf("Yes\n");
else printf("No\n");
}
else if(ch[]=='r'){
scanf("%*s%*s%d",&y);
if(fact_right(,x,y))printf("Yes\n");
else printf("No\n");
}
}
} }
void debug(int i){
if(a[i].data==inf)return ;
printf("i=%d level=%d val=%d \n",i,a[i].level,a[i].data);
debug(a[i].lson);
debug(a[i].rson);
}
int main(){
int n,m,val;
Time=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&val);
BST_insert(,val,);
}
// debug(1);
scanf("%d",&m);
solve(m);
return ;
}
(不只是代码,当然还有一些重要的注释!)
【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树的更多相关文章
- LR打不开浏览器的解决方法
很久没用LoadRunner了,今天想复习一下,免得技能生疏,安装了一个LR11,跑一下,竟然打不开IE浏览器: 这时肯定是靠谷哥跟度娘的,经过一轮搜索,可以解决打开IE了,但录制不了解决,又 ...
- PAT A1115 Counting Nodes in a BST (30 分)——二叉搜索树,层序遍历或者dfs
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- 打不开chm文件解决办法
打不开chm文件解决办法.bat regsvr32 itss.dll /sregsvr32 hhctrl.ocx /s
- poj2352树状数组解决偏序问题
树状数组解决这种偏序问题是很厉害的! /* 输入按照y递增,对于第i颗星星,它的level就是之前出现过的星星中,横坐标小于i的总数 */ #include<iostream> #incl ...
- 树状数组解决LIS---O(nlogn)
树状数组解决LIS---O(nlogn)之前写过二分查找的LIS,现在不怎么记得了,正好用Bit来搞一波.f[i]表示以a[i]结尾的LIS的长度.t[x]表示以数值x结尾的LIS的长度.即t[x]= ...
- PAT 甲级 1144 The Missing Number (20 分)(简单,最后一个测试点没过由于开的数组没必要大于N)
1144 The Missing Number (20 分) Given N integers, you are supposed to find the smallest positive in ...
- VMWare虚拟机->锁定文件失败,打不开磁盘的解决办法
VMWare虚拟机提示:锁定文件失败,打不开磁盘的解决办法 如果使用VMWare虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动,会提示:“锁定文件失败,打不开磁盘...或它所依赖的某个快照 ...
- 电脑打不开gitHub的解决方法
电脑打不开gitHub的解决方法 方法:修改本地的hosts文件 因为Github是国外网站,所以经常会遇到打不开的问题,并且有时能打开但是网速好慢 解决这个问题的方法是 : C:\Windows ...
随机推荐
- keepalived+lvs tcp check 引起的后端服务报Connection reset by peer
方法一: 取消LVS方式进行tcp转发,进而改为http方式反向代理,问题即可解决. 当然,这是在业务允许使用http的情况下,如果必须使用tcp协议,那就得使用下面的方法了. 方法二: 修改keep ...
- 【ARM-Linux开发】ctrl-xxx的对应的signal含义
ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序.ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程.ctrl-d 不是发送信 ...
- __init__调用之二
class Bar: def __init__(self,name,age): self.suibian = name #self后的名字是啥,对象就可以调用啥,而不是 __init__ 后括号形参 ...
- socket编程方法,概念
"蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也.蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也." ------------------------------------- ...
- [CF9D]How Many Trees?_动态规划_树形dp_ntt
How many trees? 题目链接:https://www.codeforces.com/contest/9/problem/D 数据范围:略. 题解: 水题. $f_{i,j}$表示$i$个节 ...
- visio 绘图素材
1. 前言 visio是个绘图的好工具,可是自带图形元素有限,没有还要自己画. 推荐几个矢量图形素材库,里边有很多图形,很方便的导入到visio中,放大也不失真. 阿里巴巴矢量图库网 stockio ...
- 机器学习-LDA主题模型笔记
LDA常见的应用方向: 信息提取和搜索(语义分析):文档分类/聚类.文章摘要.社区挖掘:基于内容的图像聚类.目标识别(以及其他计算机视觉应用):生物信息数据的应用; 对于朴素贝叶斯模型来说,可以胜任许 ...
- 生成ftp文件的目录树
依赖 <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</a ...
- Fiddler抓取https原理
首先fiddler截获客户端浏览器发送给服务器的https请求, 此时还未建立握手.第一步, fiddler向服务器发送请求进行握手, 获取到服务器的CA证书, 用根证书公钥进行解密, 验证服务器数据 ...
- yum更换源配置
今天安装mysql5.7的时候出现了点问题,最后更换yum源解决了,把这个记录一下 yum源配置(阿里云源) 1) 安装wget yum install -y wget 2) 备份/etc/yum.r ...