这是二叉搜索树吗?
来源:互联网 发布:java 异步方法 编辑:程序博客网 时间:2024/05/16 05:55
PAT上的一道题目
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
- 其左子树中所有结点的键值小于该结点的键值;
- 其右子树中所有结点的键值大于等于该结点的键值;
- 其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。
输入格式:
输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。
输入样例1:78 6 5 7 10 8 11输出样例1:
YES5 7 6 8 11 10 8输入样例2:
78 10 11 8 6 7 5输出样例2:
YES11 8 10 7 5 6 8输入样例3:
78 6 8 5 10 9 11输出样例3:
NO
思路:构造出对应二叉树先序遍历出顺序和题目所给比较,不同则是NO,相同则YES再输出后序遍历结果。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>typedef struct node{ int data; struct node *l; struct node *r;}Node;int s[1010];int v[1010];int tmp;void create1(Node *root,int x)//构造原二叉树{ Node *p; if(x<root->data) { if(root->l==NULL) { p = new Node; p->data = x; p->l = NULL; p->r = NULL; root->l = p; return; } else create1(root->l,x); } else { if(root->r==NULL) { p = new Node; p->data = x; p->l = NULL; p->r = NULL; root->r = p; return; } else create1(root->r,x); }}void create2(Node *root,int x)//构造镜像二叉树{ Node *p; if(x>=root->data) { if(root->l==NULL) { p = new Node; p->data = x; p->l = NULL; p->r = NULL; root->l = p; return; } else create2(root->l,x); } else { if(root->r==NULL) { p = new Node; p->data = x; p->l = NULL; p->r = NULL; root->r = p; return; } else create2(root->r,x); }}void firstvisit(Node *p){ if(p!=NULL) { v[tmp++] = p->data; firstvisit(p->l); firstvisit(p->r); }}void lastvisit(Node *p){ if(p!=NULL) { lastvisit(p->l); lastvisit(p->r); v[tmp++] = p->data; }}int main(){ int n,flag; Node *root,*toor; root = NULL; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&s[i]); if(i==0)//构造根节点 { root = new Node; root->data = s[i]; root->l = NULL; root->r = NULL; toor = new Node; toor->data = s[i]; toor->l = NULL; toor->r = NULL; } else { create1(root,s[i]); create2(toor,s[i]); } } tmp = 0; flag = 1; firstvisit(root); for(int i=0;i<n;i++) { if(s[i]!=v[i]) { flag = 0;break; } } if(flag==1) { printf("YES\n"); tmp=0; lastvisit(root); for(int i=0;i<n;i++) { printf("%d",v[i]); if(i!=n-1) printf(" "); } } else { tmp=0; flag =1; firstvisit(toor); for(int i=0;i<n;i++) { if(s[i]!=v[i]) { flag=0;break; } } if(flag==1) { printf("YES\n"); tmp=0; lastvisit(toor); for(int i=0;i<n;i++) { printf("%d",v[i]); if(i!=n-1) printf(" "); } } else printf("NO"); } return 0;}
0 0
- 这是二叉搜索树吗?
- 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗? (搜索二叉树的性质)
- L2-4. 这是二叉搜索树吗? PAT
- L2-4. 这是二叉搜索树吗?(区间递归)
- pat 天梯 L2-4. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- PAT L2-004. 这是二叉搜索树吗?
- PAT L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- PATL2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- L2-004. 这是二叉搜索树吗?
- JAVA中Scanner和Buffered的区别
- Linux的文件类型
- 初识 java 反射机制 (二)
- 苏伯亚将service中写的这个新方法重载到serviceImpl中
- 不想只与你梦里相见
- 这是二叉搜索树吗?
- Oracle中的一些查询语句及其执行顺序
- anaconda spyder ipthon 下执行pylab显示中文乱码问题
- OpenCV246人脸检测
- 网页布局-12种常见布局
- iOS--上传AppStore时遇到的10个大坑
- iris数据的KNN实现
- soj4515 多重部分和
- 2016最新iOS三方支付问题处理