7-28 搜索树判断(25 分)
来源:互联网 发布:gephi数据分析案例 编辑:程序博客网 时间:2024/06/06 08:45
7-28 搜索树判断(25 分)
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES
,否侧输出NO
。如果判断结果是YES
,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
78 6 5 7 10 8 11
输出样例1:
YES5 7 6 8 11 10 8
输入样例2:
78 6 8 5 10 9 11
输出样例2:
NO
主要的思想还是在建树上,二叉搜索树左小右大的性质,分清边界即可
#include<stdio.h>#include<vector>#include<stdlib.h>#include<algorithm>using namespace std;int a[1000];int flag=1;vector<int>temp1,temp2,temp3;typedef struct Node *node;struct Node{int x;node left;node right;}; node build(int s,int e){node T=(node)malloc(sizeof(struct Node));T->x=a[s];T->left=T->right=NULL;if(s==e){return T;}int index=-1,i;for(i=s+1;i<=e;i++){if(a[i]>=a[s]){index=i;break;}}if(index==-1){//只有 左 T->left=build(s+1,e);}else if(index>s+1){//左右 T->left=build(s+1,index-1);}if(index==s+1){//只有右 T->right=build(index,e);}else if(index>s+1){//左右 T->right=build(index,e);}return T;}node build2(int s,int e){node T=(node)malloc(sizeof(struct Node));T->x=a[s];T->left=T->right=NULL; if(s==e){return T;}int index=-1,i;for(i=s+1;i<=e;i++){if(a[i]<a[s]){index=i;break;}}if(index==-1){//只有 左 T->left=build2(s+1,e);}else if(index>s+1){//左右 T->left=build2(s+1,index-1);}if(index==s+1){//只有右 T->right=build2(s+1,e);}else if(index>s+1){//左右 T->right=build2(index,e);}return T;}void in(node T){if(T){in(T->left);temp1.push_back(T->x);in(T->right);}}void post(node T){if(T){post(T->left);post(T->right);if(flag){printf("%d",T->x);flag=0;}else{printf(" %d",T->x);}}}bool cmp(int a,int b){return a>b;}int main(){int n,i;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}node T=NULL;T=build(0,n-1);in(T);temp2=temp1;temp3=temp1;sort(temp2.begin(),temp2.end());sort(temp3.begin(),temp3.end(),cmp);if(temp1==temp2){printf("YES\n");post(T);}else{node T2=NULL;T2=build2(0,n-1);temp1.clear();in(T2);if(temp1==temp3){printf("YES\n");post(T2);}else{printf("NO\n");}}}
阅读全文
0 0
- 7-28 搜索树判断(25 分)
- 5-28 搜索树判断 (25分)
- 5-28 搜索树判断 (25分)
- 5-4 搜索树判断 (25分)
- 是否二叉搜索树(25 分)
- 是否二叉搜索树(25 分)
- 5-7 是否同一棵二叉搜索树 (25分)
- 是否同一棵二叉搜索树(25 分)
- 7-13 是否完全二叉搜索树(30 分)
- 7-2 是否完全二叉搜索树(27 分)
- 7-2 是否完全二叉搜索树(30 分)
- 7-1 是否同一棵二叉搜索树(25 分)
- PTA 7-1 是否同一棵二叉搜索树(25 分) 建树比较
- 7-1 是否同一棵二叉搜索树(25 分)
- 5-28 搜索树判断
- 5-28 搜索树判断
- 4-06. 搜索树判断(25) (ZJU_PAT)
- 实验项目 4-06. 搜索树判断(25)
- linux中awk进行日志文本的处理过滤
- JDBC获取数据表字段名、注释等信息
- spring boot(14)-pom.xml配置
- java设计模式-单例模式
- nginx+tomcat简单配置
- 7-28 搜索树判断(25 分)
- 最全CSS3选择器
- 表达式求值 解题报告
- spring boot(15)-异常处理
- Android逐帧动画——让图片动起来
- uploadify使用中遇到flash文件上传按钮加载不出来
- React Native 解决RenderRow只渲染一次
- spring boot(16)-mail发邮件
- Cmake链接Opencv3.20+QT