1043. Is It a Binary Search Tree

本文介绍了一种判断给定数组是否为二叉搜索树(BST)或其镜像的方法,并实现了相应的中序与后序遍历。通过递归方式检查每个节点及其子树是否符合BST的定义,进而确定整棵树的性质。文章还提供了具体的C++实现代码。

这一题原来想判断建树再输出 发现挺麻烦的 就判断后直接在原基础上直接排序,可能有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值