您的位置:首页 > 其它

1043. Is It a Binary Search Tree

2017-01-12 16:39 369 查看
这一题原来想判断建树再输出 发现挺麻烦的 就判断后直接在原基础上直接排序,可能有bug

结果发现代码写的很长,可能是将镜像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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: