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

题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857797

题目大意:

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

给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 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在同一层上"。

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

模板题:

AC代码:

 #include<bits/stdc++.h>
using namespace std;
struct node
{
int num;
node *lt,*rt,*fq;
}*tmp;
node *Insert(node *root,int num)
{
if(root==NULL)
{
root=new node;
root->num=num;
root->fq=NULL;
root->lt=NULL;
root->rt=NULL;
return root;
}
else
{
if(num<root->num)
{
root->lt=Insert(root->lt,num);
if(root->lt)
root->lt->fq=root;
}
else
{
root->rt=Insert(root->rt,num);
if(root->rt)
root->rt->fq=root;
}
}
return root;
}
void Find(node *root,int num)
{
if(root&&!tmp)
{
if(root->num==num)
{
tmp=root;
return ;
}
Find(root->lt,num);
Find(root->rt,num);
}
}
int h(node *root)
{
int h=;
if(root==NULL)
return ;
while(root->fq)
{
h++;
root=root->fq;
if(root==NULL)
break;
}
return h;
}
int main()
{
int n,m,q;
cin>>n;
node *head=NULL;
for(int i=; i<n; i++)
{
int num;
cin>>num;
head=Insert(head,num);
}
head->fq=NULL;
cin>>q;
string str1,str2,str3,str4,str5,str6;
int t1,t2;
while(q--)
{
tmp=NULL;
cin>>t1;
cin>>str1;
if(str1=="is")
{
cin>>str2;
cin>>str3;
if(str3=="root")
{
Find(head,t1);
if(tmp==NULL||tmp->num!=head->num)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
continue;
}
if(str3=="parent")
{
cin>>str4;
cin>>t2;
Find(head,t2);
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
if(tmp->fq&&tmp->fq->num==t1)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
}
if(str3=="left")
{
cin>>str4>>str5;
cin>>t2;
Find(head,t2);
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
if(tmp->lt&&tmp->lt->num==t1)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
}
if(str3=="right")
{
cin>>str4>>str5;
cin>>t2;
Find(head,t2);
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
if(tmp->rt&&tmp->rt->num==t1)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
continue;
}
}
else if(str1=="and")
{
cin>>t2;
cin>>str2>>str3;
if(str3=="siblings")
{
Find(head,t1);
node *tmp1=tmp;
// cout<<tmp1->num<<endl;
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
tmp=NULL;
Find(head,t2);
node *tmp2=tmp;
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
if(tmp1->fq&&tmp2->fq&&tmp1->fq->num==tmp2->fq->num)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
continue;
}
if(str3=="on")
{
cin>>str4>>str5>>str6;
Find(head,t1);
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
int h1=h(tmp);
// cout<<h1<<endl;
tmp=NULL;
Find(head,t2);
int h2=h(tmp);
if(tmp==NULL)
{
cout<<"No"<<endl;
continue;
}
if(h1&&h2&&h1==h2)
{
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
}
}
}
return ;
}

L3-1 二叉搜索树的结构 (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-016 二叉搜索树的结构 (30 分) 二叉树

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

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

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

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

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

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

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

随机推荐

  1. django中实现组合搜索

    一.简介 # 组合搜索# 技术方向:自动化,测试,运维,前端# 分类:Python Linux JavaScript OpenStack Node.js GO# 级别:初级 中级 高级 骨灰级 有4张 ...

  2. Spring Cloud Netflix Eureka: 多网卡环境下Eureka服务注册IP选择问题

    https://blog.csdn.net/neosmith/article/details/53126924 通过源码可以看出,该工具类会获取所有网卡,依次进行遍历,取ip地址合理.索引值最小且不在 ...

  3. C# 正则表达式中的顺序环视和逆序环视

    环视结构不匹配任何字符,只匹配文本中的特定位置. 顺序环视:从左向右查看文本,尝试匹配子表达式,如果能够匹配则返回匹配成功信息.顺序环视使用「 (?=...) 来标识」,例如「 (?=\d) 」,它表 ...

  4. B+树及数据库索引的应用

    B树 每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null. B+树 只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针. 后来,在B+树上增加了顺 ...

  5. OS + Linux nmon / nmon analyser / nmon_analyser_v52_1.zip

    s nmon_analyser_v52_1.zip https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Pow ...

  6. Hbase学习02

    第2章 Apache HBase配置 本章在“入门”一章中进行了扩展,以进一步解释Apache HBase的配置. 请仔细阅读本章,特别是基本先决条件,确保您的HBase测试和部署顺利进行,并防止数据 ...

  7. 面向对象【day08】:类的起源与metaclass(二)

    本节内容 1.概述 2.类的起源 3.__new__方法 4.__metaclass__方法 一.概述 前面我们学习了大篇幅的关于类,通过类创建对象,那我们想知道这个类到底是怎么产生的呢?它的一切来源 ...

  8. 设计模式---数据结构模式之组合模式(Composite)

    前提:数据结构模式 常常有一些组建在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的复用.这时候,将这些数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无 ...

  9. 使用git遇到的一些问题

    上传github时忽略.DS_Store方法 这个文件在mac中是管理文件夹的位置之类的信息,所以并没有必要上传到git中,这个时候就需要用git.gitignore文件来忽略此类文件. 在默认情况下 ...

  10. Kafka技术内幕 读书笔记之(四) 新消费者——消费者提交偏移量

    消费组发生再平衡时分区会被分配给新的消费者,为了保证新消费者能够从分区的上一次消费位置继续拉取并处理消息,每个消费者需要将分区的消费进度,定时地同步给消费组对应的协调者节点 .新AP I为客户端提供了 ...