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 ...
随机推荐
- ERS卫星
http://www.esa.int/Our_Activities/Operations/ERS-2 ERS-2 ROLE Earth observation (EO) LAUNCH DATE 21 ...
- keil mdk中如何确保某一段程序不被优化掉
使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在ROM的0x00002000处定位了一个函数,假设为vo ...
- Trafic control 大框图(HTB )
10.1. General diagram Below is a general diagram of the relationships of the components of a classfu ...
- HM中CU,TU的划分
相信只要是做算法改进的,首先都会遇到这么一个问题:CU,PU及TU这几个在HM中该如何打印出它们最终的划分情况呢?也经常有人来问我这个问题,一般来说,因为问我的时候我一般手头都没有现成的代码可以提供, ...
- linux学习之(四)-用户、组的操作,给文件文件夹设置组,更改目录权限、文件权限
命令帮助查看: man 命令(查看一个命令的详细帮助信息) 例:man useradd 或者用 -h 格式 命令 -h(查看一个命令的简要帮助) 例:useradd -h 用户: 在user ...
- wcf系列学习5天速成——第五天 服务托管
今天是系列的终结篇,当然要分享一下wcf的托管方面的知识. wcf中托管服务一般有一下四种: Console寄宿: 利于开发调试,但不是生产环境中的最佳实践. winform寄 ...
- boost signal2 slot_base
先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不 ...
- Linux学习之/etc/init.d/functions详解
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28773997&id=3996557 /etc/init.d/f ...
- seajs 学习笔记
seajs的作者是玉伯,具体好处优点等详见官方网址 介绍 1 模块定义define define(function(require,exports,module){ //require 引入需要的模块 ...
- c语言:从一组数据中选出可以组成三角形并且周长最长的三个数(简单)
题目如下: 思路分析: 写出完整的程序: /* 问题描述: 有n根棍子,棍子i的长度为ai.想要从中选出3根棍子组成周长尽可能长的三角形.请输 出最大的周长,若无法组成三角形则输出0. */ #inc ...