二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分)
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科)
给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,然后对结果树的结构进行描述。你需要能判断给定的描述是否正确。例如将{ 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 题目分析:
数据结构的一个题,因为数据结构老师要求用课本上的语法,故写的比较麻烦,但比较清晰易懂(基本上使用的都是C语言的语法)。
二叉搜索树的结点定义分别有节点值,左右孩子指针,父节点指针,本题由输入的结点依次插入二叉排序树,然后根据输入的几组语句,判断两个结点的关系;
输入的待判断语句的处理,然后保存有用的值须想明白;
坑点:输入的语句的结点值可能不在已构建好的树中,须判断一下。 测试点:![]()
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm> using namespace std; const int INF=0x3f3f3f3f;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode
{
ElementType Data;
Position parent;
BinTree Left;
BinTree Right;
}; void InsertTree(BinTree &T,int k)
{
if(!T)
{
T=(BinTree)malloc(sizeof(TNode));
T->Data=k;
T->Left=T->Right=T->parent=NULL;
//printf("%d\n",T->Data);
}
else
{
//printf("1111111111111111\n");
Position p=T;
Position pre=NULL;
while(p)
{
pre=p;
if(p->Data<k)
p=p->Right;
else
p=p->Left;
}
p=(Position)malloc(sizeof(TNode));
p->Data=k;
p->Left=p->Right=NULL;
p->parent=pre;
if(pre->Data>k)
pre->Left=p;
else if(pre->Data<k)
pre->Right=p;
else
return ;
}
} Position Search(BinTree T,int k)
{
Position p=T;
while(p)
{
if(p->Data>k)
p=p->Left;
else if(p->Data<k)
p=p->Right;
else
return p;
}
return NULL;
}
int GetNumber(BinTree T,int k)
{
int sum=;
Position p=T;
while(p)
{
if(p->Data>k)
p=p->Left;
else if(p->Data<k)
p=p->Right;
else
return sum;
sum++;
}
return INF;
}
int main()
{
BinTree T=NULL;
int n;
scanf("%d",&n);
int v;
for(int i=; i<n; i++)
{
scanf("%d",&v);
InsertTree(T,v);
}
int m;
scanf("%d",&m);
getchar();
char s[];
int v1,v2;
for(int i=; i<m; i++)
{
scanf("%d %s",&v1,s);
if(!strcmp(s,"is"))
{
scanf("%s",s);
scanf("%s",s); if(!strcmp(s,"root"))
{
if(T&&T->Data==v1)
printf("Yes\n");
else
printf("No\n");
continue;
}
else if(!strcmp(s,"left"))
{
Position p1=Search(T,v1);
scanf("%s",s);
scanf("%s %d",s,&v2);
Position p2=Search(T,v2);
if(p2&&p1&&p2->Left==p1)
printf("Yes\n");
else
printf("No\n");
}
else if(!strcmp(s,"right"))
{
Position p1=Search(T,v1);
scanf("%s",s);
scanf("%s %d",s,&v2);
Position p2=Search(T,v2);
if(p2&&p1&&p2->Right==p1)
printf("Yes\n");
else
printf("No\n");
}
else if(!strcmp(s,"parent"))
{
Position p1=Search(T,v1);
scanf("%s %d",s,&v2);
Position p2=Search(T,v2);
if(p2&&p1&&p2->parent==p1)
printf("Yes\n");
else
printf("No\n");
}
}
else if(!strcmp(s,"and"))
{
scanf("%d %s",&v2,s);
scanf("%s",s);
if(!strcmp(s,"siblings"))
{
Position p1=Search(T,v1);
Position p2=Search(T,v2);
if(p1&&p2&&p1->parent==p2->parent)
printf("Yes\n");
else
printf("No\n");
}
else if(!strcmp(s,"on"))
{
scanf("%s",s);
scanf("%s",s);
scanf("%s",s);
int n1=GetNumber(T,v1);
//printf("%d\n",n1);
int n2=GetNumber(T,v2);
if(n1==n2&&n1!=INF)
printf("Yes\n");
else
printf("No\n");
}
}
}
return ;
}
/* 5
2 4 1 3 0
8
10 is the root
10 and 100 are siblings
10 and 100 are on the same level
10 is the parent of 100
10 is the left child of 100
100 is the right child of 10
10 and 100 are on the same level
100 is the right child of 10
*/
我的0分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<functional>
#include<cmath>
#include<string>
using namespace std;
int a[];
int b[];
int insert(int root,int x)
{
if(a[root]==-)
{
a[root]=x;
return root;
}
else
{
if(x>a[root]) insert(*root+,x);
else insert(*root,x);
}
} int main()
{
int n;
cin>>n;
memset(a,-,sizeof a);
memset(b,-,sizeof b);
for(int i=;i<=n;i++)
{
int x;
cin>>x;
int f=insert(,x);
b[x]=f;
}
int m;
cin>>m;
for(int i=;i<=m;i++)
{
long long x;
cin>>x;//A char s[];
if(||x<||b[x]==-)
{
cin>>s; cout<<"No"<<endl;
continue;
} cin>>s;
if(s[]=='a')// and
{
int y;
cin>>y; cin>>s;//are cin>>s;//sil on if(s[]=='s')
{
if(b[x]/==b[y]/) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
cin>>s; cin>>s; cin>>s; int x2=b[x]/;
int y2=b[y]/;
while(x2!=&&y2!=)
{
x2=x2/;
y2=y2/;
}
if(x2==&&y2==&&x!=y) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
else
{
cin>>s; cin>>s; if(s[]=='r'&&s[]=='o')
{
if(b[x]==)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(s[]=='p')
{
cin>>s; int y;
cin>>y; if(b[y]/==b[x]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(s[]=='l')
{
cin>>s; cin>>s; int y;
cin>>y;
;
if(b[y]*==b[x]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else if(s[]=='r')
{
cin>>s; cin>>s; int y;
cin>>y; if(b[y]*+==b[x]) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
}
}
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历的更多相关文章
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根 ...
- 天梯赛练习 L3-016 二叉搜索树的结构 (30分)
题目分析: 用数型结构先建树,一边输入一边建立,根节点的下标为1,所以左孩子为root*2,右孩子为root*2+1,输入的时候可用cin输入字符串也可用scanf不会超时,判断是否在同一层可以判断两 ...
- 家谱处理(30 分)(字符串的处理substr)
家谱处理(30 分) 人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: Jo ...
- PAT甲级 1155 Heap Paths (30分) 堆模拟
题意分析: 给出一个1000以内的整数N,以及N个整数,并且这N个数是按照完全二叉树的层序遍历输出的序列,输出所有的整条的先序遍历的序列(根 右 左),以及判断整棵树是否是符合堆排序的规则(判断是大顶 ...
- 【PAT甲级】1022 Digital Library (30 分)(模拟)
题意: 输入一个正整数N(<=10000),接下来输入N组数据,ID,书名,作者,关键词,出版社,出版年份. 然后输入一个正整数M(<=1000),接下来输入查询的数据,递增输出ID,若没 ...
- PTA二叉搜索树的操作集 (30分)
PTA二叉搜索树的操作集 (30分) 本题要求实现给定二叉搜索树的5种常用操作. 函数接口定义: BinTree Insert( BinTree BST, ElementType X ); BinTr ...
- PTA 7-2 二叉搜索树的结构(30 分)
7-2 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大 ...
- PTA 7-1 是否完全二叉搜索树 (30分)
PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
随机推荐
- eclipse中web项目部署到本地tomcat中,但是在本地的tomcat的webapp下找不到发布的项目
eclipse不像MyEclipse默认将项目部署到tomcat安装目录下的webapps中,而默认部署到工作目录下 为了使项目默认部署到tomcat安装目录下的webapps中,show view- ...
- 深入Spring:自定义注解加载和使用
前言 在工作中经常使用Spring的相关框架,免不了去看一下Spring的实现方法,了解一下Spring内部的处理逻辑.特别是开发Web应用时,我们会频繁的定义@Controller,@Service ...
- Spark性能优化指南--基础篇
前言 开发调优 调优概述 原则一:避免创建重复的RDD 原则二:尽可能复用同一个RDD 原则三:对多次使用的RDD进行持久化 原则四:尽量避免使用shuffle类算子 原则五:使用map-side预聚 ...
- 做一个完整的Java Web项目需要掌握的技能
最近自己做了几个JavaWeb项目,有公司的商业项目,也有个人做着玩的小项目,写篇文章记录总结一下收获,列举出在做项目的整个过程中,所需要用到的技能和知识点,带给还没有真正接触过完整Java Web项 ...
- spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)
Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码.开发者只需要编写写入和读取数据库相关的代码即可. 正如在之前的小节中论述过的,Spring将数据库访问过程中的模 ...
- vs plug
工欲善其事,必先利其器.尽管visual studio本身已经非常强大,但优秀的插件仍然可以帮开发者大大提高效率,以下是牛牛非常喜欢的vs插件. 1.Indent Guides 绝对是必须的,有了这些 ...
- [转载]java导出word的5种方式
在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...
- Hadoop2.5.2+HA+zookeeper3.4.6详细配置过程
心血之作,在熟悉hadoop2架构的过程耽误了太长时间,在搭建环境过程遇到一些问题,这些问题一直卡在那儿,不得以解决,耽误了时间.最后,千寻万寻,把问题解决,多谢在过程提供帮助的大侠.这篇文章中,我也 ...
- 201621123014《Java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 答: 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集题目) 1.1 实验总结.并回答: ...
- CodeForces - 154C:Double Profiles (hash+排序)
You have been offered a job in a company developing a large social network. Your first task is conne ...