二叉搜索树的结构(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=1;
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=0; i<n; i++)
{
scanf("%d",&v);
InsertTree(T,v);
}
int m;
scanf("%d",&m);
getchar();
char s[110];
int v1,v2;
for(int i=0; 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 0;
}
/* 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
*/
坚持不懈地努力才能成为大神!
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历的更多相关文章
- 二叉搜索树的结构(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个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
随机推荐
- Django 之restframework1
Restframework 这里先简单的介绍一下restful协议 ----一切皆是资源,操作只是请求方式 基于restful协议的框架有很多Django下的restframework只是其中的一种 ...
- centos7 使用postgres
1: http://www.cnblogs.com/think8848/p/5877076.html 2:http://blog.csdn.net/xuaa/article/details/52262 ...
- 中国移动OnetNet云平台 使用WIFI模块ESP8266 TCP非透传模式传输数据流步骤
测试使用工具: WIFI模块型号:ESP8266 https://item.taobao.com/item.htm?spm=a1z10.1-c.w137712-175513579.2.btbD9X&a ...
- iOS 展示 gif
gif 图 是多张依次有连续动作的图 顺时间展示的一种动态效果图 . 有的是均匀时间更换下一张 有的 则不是均匀时间变化 1. 那么 对于均匀 时间变化的gif图 比较适合 使用 iOS 系统自 ...
- Delphi 函数的重载和作用域
1.在delphi 中,我们可以使用相同的函数名来调用不同的函数,我们称这个函数为重载,函数的参数类型和参数的个数可以不同,用到的关键字overload:格式如下: function addInt(x ...
- LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行
延迟执行是指一个表达式的值延迟获取,知道它的值真正用到. 当你用foreach循环时,表达式才真正的执行. 延迟执行有个最重要的好处:它总是给你最新的数据 实现延迟运行 你可以使用yield关键字实现 ...
- Victor/ArrayList/LinkedList/Stack/CopyOnWriteArrayList 区别
Victor:采用数组的方式存储数据,与ArrayList相同,线程安全.性能比ArrayList差 ArrayList:采用数据的方式存储数据,线程不安全.ArrayList使用数组来存储数据,使用 ...
- 介绍几款Web服务器性能压力测试工具
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...
- 仿联想商城laravel实战---3、前端页面搭建(什么情况下需要路由接参数)
仿联想商城laravel实战---3.前端页面搭建(什么情况下需要路由接参数) 一.总结 一句话总结: 比如访问课程的时候,不同的课程(比如云知梦),比如访问不同的商品,比如访问不同的分类 //商品详 ...
- unity3D实现多点触碰
实现多点触碰是利用input这个类里面的方法实现的. 从edit-project settings-input就可以看到input能够得到的轴. 想要读取轴向可以使用Input.GetAxis方法获取 ...
