二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)

给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 2 4 1 3 0 }插入后,得到一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。

输入格式:

输入在第一行给出一个正整数N(≤),随后一行给出N个互不相同的整数,数字间以空格分隔,要求将之顺次插入一棵初始为空的二叉搜索树。之后给出一个正整数M(≤),随后M行,每行给出一句待判断的陈述句。陈述句有以下6种:

  • A is the root,即"A是树的根";
  • A and B are siblings,即"AB是兄弟结点";
  • A is the parent of B,即"AB的双亲结点";
  • A is the left child of B,即"AB的左孩子";
  • A is the right child of B,即"AB的右孩子";
  • A and B are on the same level,即"AB在同一层上"。

题目保证所有给定的整数都在整型范围内。

输出格式:

对每句陈述,如果正确则输出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

输出样例:

Yes
Yes
Yes
Yes
Yes
No
No
No
题解:主要就是给出来的点可能不在树上,用map标记一下即可,其他的直接模拟即可~~
#include<bits/stdc++.h>
using namespace std;
string str1,str2,str3,str4,str5,str6;
int n,x,y,q;
map<int,int>mp;
struct node
{
node *l,*r;
int data;
};
node *Insert(node *root,int x)
{
if(root==NULL)
{
root=new node;
root->data=x;
root->l=root->r=NULL;
return root;
}
else
{
if(x<root->data)
root->l=Insert(root->l,x);
else if(x>root->data)
root->r=Insert(root->r,x);
}
return root;
} int Find_F(node *root,int x,int y)//x是否是y的父亲
{
if(root)
{
if(root->data==x)
{
if(root->l&&root->l->data==y)
{
return ;
}
if(root->r&&root->r->data==y)
{
return ;
}
}
if(x<root->data)//为了保证结果的正确性,要正确利用二叉搜索的性质进行return,以下同理
return Find_F(root->l,x,y);
if(x>root->data)
return Find_F(root->r,x,y);
}
return ;
}
int Find_L(node *root,int x,int y)//x是否是y的左孩子
{
if(root)
{
if(root->data==y)
{
if(root->l&&root->l->data==x)
{
return ;
}
}
if(y<root->data)
return Find_L(root->l,x,y);
if(y>root->data)
return Find_L(root->r,x,y);
}
return ;
}
int Find_R(node *root,int x,int y)//x是否是y的右孩子
{
if(root)
{
if(root->data==y)
{
if(root->r&&root->r->data==x)
{
return ;
}
}
if(y<root->data)
return Find_R(root->l,x,y);
if(y>root->data)
return Find_R(root->r,x,y);
}
return ;
}
int Find_C(node *root,int x,int y)//x和y是否为兄弟节点
{
if(root)
{
if(root->l&&root->r)
{
if(root->l->data==x&&root->r->data==y)
{
return ;
}
if(root->r->data==x&&root->l->data==y)
{
return ;
}
}
return max(Find_C(root->l,x,y),Find_C(root->r,x,y));//不管左右,只要找到即可
}
return ;
}
int Find_Level(node *root,int x,int step)//x的深度或高度
{
if(root)
{
if(root->data==x)
return step;
if(x<root->data)
return Find_Level(root->l,x,step+);
if(x>root->data)
return Find_Level(root->r,x,step+);
}
return ;
} int main()
{
cin>>n;
node *root=NULL;
for(int i=; i<=n; i++)
{
int r;
cin>>r;
mp[r]++;//将其标记,作为判断条件
root=Insert(root,r);
}
cin>>q;
while(q--)
{
cin>>x;
cin>>str1;
if(str1=="is")
{
cin>>str2>>str3;
if(str3=="root")
{
if(root->data==x)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else if(str3=="parent")
{
cin>>str4>>y;
int r=Find_F(root,x,y);//x是否是y的father
if(r&&mp[x]&&mp[y])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else if(str3=="left")
{
cin>>str4>>str5>>y;
int r=Find_L(root,x,y);//x是否是y的左孩子
if(r&&mp[x]&&mp[y])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else if(str3=="right")
{
cin>>str4>>str5>>y;
int r=Find_R(root,x,y);//x是否是y的右孩子
if(r&&mp[x]&&mp[y])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
else
{
cin>>y>>str2>>str3;//是否为兄弟节点
if(str3=="siblings")
{
int r=Find_C(root,x,y);
if(r&&mp[x]&&mp[y])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
else
{
cin>>str4>>str5>>str6;//最后一种情况,看是否在同一层上
int Level_x=Find_Level(root,x,);
int Level_y=Find_Level(root,y,);
if((Level_x==Level_y)&&Level_x&&mp[x]&&mp[y])
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
}
return ;
}

L3-016 二叉搜索树的结构 (30 分)的更多相关文章

  1. 天梯赛练习 L3-016 二叉搜索树的结构 (30分)

    题目分析: 用数型结构先建树,一边输入一边建立,根节点的下标为1,所以左孩子为root*2,右孩子为root*2+1,输入的时候可用cin输入字符串也可用scanf不会超时,判断是否在同一层可以判断两 ...

  2. PTA 7-2 二叉搜索树的结构(30 分)

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

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

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

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

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

  5. 【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树

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

  6. L3-1 二叉搜索树的结构 (30 分)

    讲解的很不错的链接:https://blog.csdn.net/chudongfang2015/article/details/79446477#commentBox 题目链接:https://pin ...

  7. L3-016 二叉搜索树的结构 (30 分) 二叉树

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

  8. PAT L3-016 二叉搜索树的结构

    https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...

  9. L3-016. 二叉搜索树的结构

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

随机推荐

  1. php对象: __clone, __toString, __call,__isset, __unset, __sleep, __wakeup,

    __clone: 克隆对象,自动完成操作   clone()  __toString:  return返回字符串  __call: 当调用不存在的函数时,自动执行该方法,并返回相关值 __isset: ...

  2. springMVC源码阅读-通过画图理解一个请求生命周期(十二)

  3. SQL基础教程(第2版)第3章 聚合与排序:3-1 对表进行聚合查询

    3-1 对表进行聚合查询 ● 使用聚合函数对表中的列进行计算合计值或者平均值等的汇总操作.● 通常,聚合函数会对NULL以外的对象进行汇总.但是只有COUNT函数例外,使用COUNT(*)可以查出包含 ...

  4. HDU-2087 C - 剪花布条(KMP基本)

    http://acm.hdu.edu.cn/showproblem.php?pid=2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能 ...

  5. 和我一起从0学算法(C语言版)(一)

    第一章 排序 第一节 简化版桶排法 友情提示:此文章分享给所有小白,大牛请绕路! 生活中很多地方需要使用排序,价格的由低到高.距离的由远及近等,都是排序问题的体现.如果排序量较少,依靠个人能力很容易实 ...

  6. cuda cudaTextureFilterMode

    cudaFilterModePoint:点模式,返回最接近的一个点,即最近邻插值.插值公式 tex(x) = T(i),i=floor(x),注意是对坐标向下取整,所以一般对输入坐标值+0.5,避免无 ...

  7. 最小二乘拟合(scipy实现)

    Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...

  8. spring容器抽象的具体实现

    1.BeanFactory 接口与 ApplicationContext 接口 (1)spring 提供了两种类型的IOC容器实现.BeanFactory 和 ApplicationContext ( ...

  9. Shell程序实例集锦一

    2007-12-13 07:51:40 标签:实例 程序 Shell 休闲 职场 Shell程序实例集锦一      前言:下面这些hell实例都是自己写的或者用过的一些Shell小程序.整理整理. ...

  10. HTTP协议PUT与POST

    摘要: PUT是idempotent的方法,而POST不是. 原文:HTTP协议中PUT和POST使用区别 作者:Never-say-Never 有的观点认为,应该用POST来创建一个资源,用PUT来 ...