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

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

输入格式:

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

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

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

输出格式:

对每句陈述,如果正确则输出“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 建树过程中记录每个点高度,以及每个点指向的结点,方便查询。
#include <bits/stdc++.h>
using namespace std;
struct tree
{
tree *left, *right, *f;
int height,data;
}*root;
int n,d,k,a,b;
map<int,tree *> q;
map<int,int>o;
tree *creat(int d)
{
tree *p = new tree();
p->left = NULL;
p->right = NULL;
p->f = NULL;
p->height = ;
p->data = d;
q[d] = p;
o[d] = ;
return p;
}
void insert_(tree *root,tree *t)
{
if(t->data > root->data)
{
if(root -> right == NULL)root -> right = t,t -> f = root,t-> height = root -> height + ;
else insert_(root -> right,t);
}
else
{
if(root -> left == NULL)root -> left = t,t -> f = root,t-> height = root -> height + ;
else insert_(root -> left,t);
}
}
int main()
{
cin>>n;
if(n)
{
cin>>d;
root = creat(d);
}
for(int i = ;i < n;i ++)
{
cin>>d;
tree *p = creat(d);
insert_(root,p);
}
cin>>k;
for(int i = ;i < k;i ++)
{
cin>>a;
string op;
cin>>op;
if(op == "is")
{
cin>>op>>op;
if(op == "root")
{
if(o[a] && root == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(op == "parent")
{
cin>>op>>b;
if(o[a] && o[b] && q[b] -> f == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(op == "left")
{
cin>>op>>op>>b;
if(o[a] && o[b] && q[b] -> left == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
cin>>op>>op>>b;
if(o[a] && o[b] && q[b] -> right == q[a])cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
else
{
cin>>b>>op>>op;
if(op == "on")
{
cin>>op>>op>>op;
if(o[a] && o[b] && q[a] -> height == q[b] -> height)
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
else
{
if(o[a] && o[b] && q[a] -> f == q[b] -> f)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
}

数组建树。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <map>
using namespace std;
int pos;
struct BST {
int l,r,f,d,h;
BST() {
l = r = f = d = h = ;
}
}t[];
map<int,int> mp;
void Insert(int h,int no,int d) {
if(d < t[no].d) {
if(t[no].l) Insert(h + ,t[no].l,d);
else {
t[no].l = ++ pos;
t[pos].d = d;
t[pos].f = no;
t[pos].h = h + ;
}
}
else {
if(t[no].r) Insert(h + ,t[no].r,d);
else {
t[no].r = ++ pos;
t[pos].d = d;
t[pos].f = no;
t[pos].h = h + ;
}
}
}
int main() {
int n,d,m;
cin>>n;
cin>>d;
t[++ pos].d = d;
mp[d] = pos;
for(int i = ;i < n;i ++) {
cin>>d;
Insert(,,d);
mp[d] = pos;
}
cin>>m;
string s;
int a,b;
for(int i = ;i < m;i ++) {
cin>>a;
cin>>s;
bool flag = pos && mp[a] != ;
if(s == "is") {
cin>>s>>s;
if(s == "root") {
flag &= t[].d == a;
}
else if(s == "parent") {
cin>>s>>b;
flag &= mp[b] != && t[t[mp[b]].f].d == a;
}
else if(s == "left") {
cin>>s>>s>>b;
flag &= mp[b] != && t[t[mp[b]].l].d == a;
}
else {
cin>>s>>s>>b;
flag &= mp[b] != && t[t[mp[b]].r].d == a;
}
}
else {
cin>>b>>s>>s;
flag &= mp[b] != ;
if(s == "on") {
cin>>s>>s>>s;
flag &= t[mp[a]].h == t[mp[b]].h;
}
else {
flag &= t[mp[a]].f == t[mp[b]].f;
}
}
puts(flag ? "Yes" : "No");
}
}

L3-016. 二叉搜索树的结构的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  2. 从三十而立的迷茫,到30K

    很标题党的标题,但是希望分享一下自己的经历,一份有点儿不寻常的经历. 12年创业,到17年末,举步维艰,没有项目,公司只剩下两个人,负债,现实给我这个每见过什么市面,却自命不凡的人狠狠的一个耳光.加上 ...

  3. 远程桌面 虚拟打印 到本地打印机(虚拟化 终端 远程接入 RemoteApp)

    使用远程桌面或remoteapp进行打印时,若需使用本地的打印机,需要通过重定向方式,但本地打印机如果五花八门比较杂,那给服务器安装打印机驱动很麻烦. 其实可以借助虚拟打印机简化操作,省去给服务器安装 ...

  4. ES6标准入门 第五章:函数的扩展

    1.函数参数的默认值 (1)基本用法 ES5 中, 不能直接为函数的参数指定默认值.只能采用变通的方法. function log(x, y) { y = y || 'World'; console. ...

  5. 第十届山东省acm省赛补题(2)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      ...

  6. 一个简单的dns服务器

    options { listen-on port 53 { any; }; listen-on-v6 port 53 { any; }; directory "/srv/app/named& ...

  7. springcloud(一)

    Spring Cloud是什么鬼? Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线. ...

  8. kafka使用问题解决

    java.lang.UnsupportedClassVersionError:org/apach/kafka/comon/utils/Utils:Unsupport major.minor versi ...

  9. SVN服务器和客户端使用教程总结

    一.SVN简介 Subversion是什么? 它是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历 ...

  10. iview报错[Vue warn]: Error in render: "TypeError: ctx.injections.tableRoot.$scopedSlots[ctx.props.column.slot] is not a function"

    原因是我使用了iview的<Table>组件,我给Table组件的columns中定义了4个含有slot的列,但是实际在<Table>中只使用了其中3个,导致的报错. 也就是说 ...