Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)
Pat1043代码
A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than or equal to the node's key.
- Both the left and right subtrees must also be binary search trees.
If we swap the left and right subtrees of every node, then the resulting tree is called the Mirror Image of a BST.
Now given a sequence of integer keys, you are supposed to tell if it is the preorder traversal sequence of a BST or the mirror image of a BST.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=1000). Then N integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, first print in a line "YES" if the sequence is the preorder traversal sequence of a BST or the mirror image of a BST, or "NO" if not. Then if the answer is "YES", print in the next line the postorder traversal sequence of that tree. All
the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.
Sample Input 1:
7
8 6 5 7 10 8 11
Sample Output 1:
YES
5 7 6 8 11 10 8
Sample Input 2:
7
8 10 11 8 6 7 5
Sample Output 2:
YES
11 8 10 7 5 6 8
Sample Input 3:
7
8 6 8 5 10 9 11
Sample Output 3:
NO
AC代码:二叉树的重建与遍历。
#include<cstdio>
#include<cstdlib>
#define MAX 1005 using namespace std; typedef struct Node
{
int data;
Node *left;
Node *right;
}Node; int Keys[MAX];
int PreOrder[MAX];
int PreOrderImg[MAX];
int PostOrder[MAX];
int index=0; void InsertNode(Node **root,int key,bool Img)
{
if(*root==NULL)
{
*root=(Node *)malloc(sizeof(Node));
if(!(*root))
{
printf("No enough memory!\n");
exit(-1);
}
(*root)->left=NULL;
(*root)->right=NULL;
(*root)->data=key;
return;
}
else
{
if(Img)
{
if((*root)->data<=key)
InsertNode(&((*root)->left),key,Img);
else
InsertNode(&((*root)->right),key,Img);
}
else
{
if((*root)->data>key)
InsertNode(&((*root)->left),key,Img);
else
InsertNode(&((*root)->right),key,Img);
}
}
} void CreateBSTree(Node **root,int keys[],int len,bool Img)
{
for(int i=0;i<len;i++)
InsertNode(root,keys[i],Img);
} void PreOrderTraverse(Node *root,bool Img)
{
if(root==NULL)
return ;
if(Img)
PreOrderImg[index++]=root->data;
else
PreOrder[index++]=root->data;
if(root->left)
PreOrderTraverse(root->left,Img);
if(root->right)
PreOrderTraverse(root->right,Img);
} bool IsSame(int keys[],int len,bool Img)
{
int i;
if(Img)
{
for(i=0;i<len;i++)
{
if(keys[i]!=PreOrderImg[i])
return false;
}
return true;
}
else
{
for(i=0;i<len;i++)
{
if(keys[i]!=PreOrder[i])
return false;
}
return true;
}
} void PostOrderTraverse(Node *root)
{
if(root==NULL)
return;
if(root->left)
PostOrderTraverse(root->left);
if(root->right)
PostOrderTraverse(root->right);
PostOrder[index++]=root->data;
} void Display(int len)
{
int i;
for(i=0;i<len;i++)
{
if(i==0)
printf("%d",PostOrder[i]);
else
printf(" %d",PostOrder[i]);
}
printf("\n");
} void Destroy(Node **root)
{
if((*root)->left==NULL&&(*root)->right==NULL)
{
free(*root);
*root=NULL;
}
else if((*root)->left)
Destroy(&((*root)->left));
else if((*root)->right)
Destroy(&((*root)->right));
} int main(int argc,char *argv[])
{
int i,n;
Node *root=NULL;//这两个初始化必须得有,否则会出现段错误。在自己的机器
Node *rootImg=NULL; //上能够执行,但提交后就段错误,预计是server端
scanf("%d",&n); //编译器的问题吧
for(i=0;i<n;i++)
scanf("%d",&Keys[i]);
CreateBSTree(&root,Keys,n,false);
CreateBSTree(&rootImg,Keys,n,true);
index=0;
PreOrderTraverse(root,false);
if(IsSame(Keys,n,false))
{
printf("YES\n");
index=0;
PostOrderTraverse(root);
Display(n);
}
else
{
index=0;
PreOrderTraverse(rootImg,true);
if(IsSame(Keys,n,true))
{
printf("YES\n");
index=0;
PostOrderTraverse(rootImg);
Display(n);
}
else
{
printf("NO\n");
}
}
Destroy(&root);
Destroy(&rootImg); return 0;
}
Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)的更多相关文章
- PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789220.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT (Advanced Level) Practice(更新中)
Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...
- PAT (Advanced Level) Practice 1001-1005
PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...
- PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642
PAT (Advanced Level) Practice 1046 Shortest Distance (20 分) 凌宸1642 题目描述: The task is really simple: ...
- PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...
- PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642
PAT (Advanced Level) Practice 1041 Be Unique (20 分) 凌宸1642 题目描述: Being unique is so important to peo ...
- PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642
PAT (Advanced Level) Practice 1035 Password (20 分) 凌宸1642 题目描述: To prepare for PAT, the judge someti ...
- PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642
PAT (Advanced Level) Practice 1031 Hello World for U (20 分) 凌宸1642 题目描述: Given any string of N (≥5) ...
- PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642
PAT (Advanced Level) Practice 1027 Colors in Mars (20 分) 凌宸1642 题目描述: People in Mars represent the c ...
- PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642
PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642 题目描述: Notice that the number ...
随机推荐
- 在 Linux ubuntu 上安装 *.sh 文件
简单说来就两步: 增加可执行权限 执行 事情是这样的,打算在 ubuntu 上安装一个 NetBeans IDE 来学习 Java,但是下载下来的文件是 .sh 格式的.图形界面下右键没有执行的选项. ...
- VC操作Image的三种方法(收集)
忘记从哪来收集过来的资料了,暂且不管是哪位老兄写的,只道一声谢谢. 仅管VC有提供相应的API和类来操作bmp位图.图标和(增强)元文件,但却不支持jpg.gif和png等格式的图片,而这几种格式却是 ...
- delphi 读网页线程TReadHtmlThread
读网页,通常是一个耗时操作.故把读网页放入线程是显得比较重要了. 本例用改进后的 TIdhttpEx 加上线程来实现读网页. 它的父类TSimpleThread 在此 本例程源码在此 源码中包含了所有 ...
- perl /m修饰符使用说明
高级用法: 多行匹配: grok正则和普通正则一样, 默认是不支持匹配回车换行的. perl的/m选项 The /m modifier allows ^ and $ to match immediat ...
- 使用JS控制struts的日期控件datetimepicker
功能需求:页面主要有两个日历框,一个是当前日期,一个是去年同期,要求当用户改变当前日期时,同步修改去年同期为当前日期-1年. 当时刚接触到需求的第一时间想到的就是为< sx:datetimepi ...
- c++犯的错误
(1) 定义的变量一定要初始化:long long llnum; int nNum = 4; llnum = nNum; (llnum的值不是4,高四位是随机数) int型变量赋值给longl ...
- [置顶] java web 动态服务器
写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...
- [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found
google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...
- SQL Server执行计划那些事儿(3)——书签查找
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...
- iOS多线程的基本使用
一.NSThread: 程序就是一段代码,是静态的概念 进程是运行起来的程序,是动态的概念,进程需要占内存空间 线程是进程的基本单位,一个进程至少有一个线程,iOS程序默认有一个主线程,用来显示和操作 ...