1043. Is It a Binary Search Tree
2017-01-12 16:39
369 查看
这一题原来想判断建树再输出 发现挺麻烦的 就判断后直接在原基础上直接排序,可能有bug
结果发现代码写的很长,可能是将镜像BST与BST分开来的关系
结果发现代码写的很长,可能是将镜像BST与BST分开来的关系
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b using namespace std; int b[10001]; int isbt(int a[],int index,int pos) { int lindex,lpos,rindex,rpos; lpos=pos;//防止无右子树 无赋值的情况。 int lflag=0,rflag=0,flag=0; if(index+1>=pos) return 1; for(int i=index+1;i<pos;i++) if(a[index]>a[i]&&!lflag&&!rflag) { lindex=i; lflag=1; } else if(a[index]<=a[i]&&!rflag) { rindex=i; lpos=i; rflag=1; } else if(a[index]>a[i]&&rflag) flag=1; if(flag) return 0; else { if(lflag) if(!isbt(a,lindex,lpos)) return 0; if(rflag) { rpos=pos; if(!isbt(a,rindex,rpos)) return 0; } } return 1; } void btporder(int a[],int index,int pos,int bindex) { int lindex,lpos,rindex,rpos; int lflag=0,rflag=0; for(int i=index+1;i<pos;i++) { if(a[index]>a[i]&&!lflag) { lindex=i; lflag=1; } if(a[index]<=a[i]&&!rflag) { rindex=i; lpos=i; rflag=1; break; } } b[bindex]=a[index]; if(lflag) { if(!rflag) { if(bindex>0) btporder(a,lindex,pos,bindex-1); } else { if(bindex-pos+rindex-1>=0) btporder(a,lindex,lpos,bindex-pos+rindex-1); } } if(rflag) { if(!lflag) { if(bindex>0) btporder(a,index+1,pos,bindex-1); } else { if(bindex>0) btporder(a,rindex,pos,bindex-1); } } } void btmporder(int a[],int index,int pos,int bindex) { int lindex,lpos,rindex,rpos; int lflag=0,rflag=0; for(int i=index+1;i<pos;i++) { if(a[index]<=a[i]&&!lflag)//找到左子树的根 { lindex=i; lflag=1; } if(a[index]>a[i]&&!rflag)//找到右子树的根 { rindex=i; lpos=i; rflag=1; break; } } b[bindex]=a[index]; if(lflag)//判断是否存在左子树 { if(!rflag)//存在判断是否存在右子树 btmporder(a,lindex,pos,bindex-1);//进行左子树后序排序 else { btmporder(a,lindex,lpos,bindex-pos+rindex-1); } } if(rflag)//判断是否存在右子树 { if(!lflag)//判断是否存在左子树 btmporder(a,index+1,pos,bindex-1);//进行左子树后序排序 else btmporder(a,rindex,pos,bindex-1); } } int ismbt(int a[],int index,int pos) { if(index>=pos-1) return 1; int lindex,lpos,rindex,rpos; lpos=pos;//防止出现无右子树 未赋值的情况 int lflag=0,rflag=0,flag=0; for(int i=index+1;i<pos;i++) if(a[index]<=a[i]&&!lflag&&!rflag)//找到左子树的根,同时防止出现将BST判定为镜像BST 与最后一个case有关 { lindex=i; lflag=1; } else if(a[index]>a[i]&&!rflag)//找到右子树的根, { rindex=i; lpos=i; rflag=1; } else if(a[index]<=a[i]&&rflag) flag=1; if(flag)//以index节点为根的树是否为BST return 0; else { if(lflag)//判断左子树是否存在 if(!ismbt(a,lindex,lpos)) return 0; if(rflag){//右子树是否存在 rpos=pos; if(!ismbt(a,rindex,rpos))//判断右子树是否是BST return 0; } } return 1; } int main() { int n; int a[10001]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); if(n>0&&ismbt(a,0,n))//判断是否是镜像BST n>0加不加无所谓 { printf("YES\n"); btmporder(a,0,n,n-1);//后序 for(int i=0;i<n;i++) if(i==0) printf("%d",b[i]); else printf(" %d",b[i]); printf("\n"); } else if(n>0&&isbt(a,0,n))//判断是否是BST { printf("YES\n"); btporder(a,0,n,n-1);//后序 for(int i=0;i<n;i++) if(i==0) printf("%d",b[i]); else printf(" %d",b[i]); printf("\n"); } else printf("NO\n"); return 0; }
相关文章推荐
- PAT_A 1043. Is It a Binary Search Tree (25)
- 【PAT】1043. Is It a Binary Search Tree
- PAT甲级1043. Is It a Binary Search Tree (25)
- PAT 1043 Is It a Binary Search Tree(二叉查找树)
- 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)
- pat 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree (25)
- 浙大PAT (Advanced Level) Practise 1043 Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)
- 1043.Is It a Binary Search Tree
- PAT (Advanced Level) 1043. Is It a Binary Search Tree (25) 判断序列是否为BST的先序遍历,递归
- 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree
- PAT 1043. Is It a Binary Search Tree (25)
- 1043. Is It a Binary Search Tree (25)
- PAT1043:Is It a Binary Search Tree
- 1043. Is It a Binary Search Tree (25)