L2_004这是二叉搜索树吗(判断(镜面)二叉搜索树+前序->后

2018-03-29  本文已影响0人  我好菜啊_

一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,
其左子树中所有结点的键值小于该结点的键值;
其右子树中所有结点的键值大于等于该结点的键值;
其左右子树都是二叉搜索树。
所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。
给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。


输入格式:
输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。
输出格式:
如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。


输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8



#include <iostream>
#define N 1000
using namespace std;
int nums[N];
int flagBT=0;
int flagMBT=0;
int coutflag=0;
void isBT(int start,int endd)
{
    if(start>=endd)
        return;
    int root=nums[start];
    int i;
    for(i=start+1;i<=endd;++i){
        if(nums[i]>=root)
            break;
    }
    int j;
    for(j=i;j<=endd;++j){
        if(nums[j]<root){
            flagBT=1;
            break;
        }
    }
    if(!flagBT)
        isBT(start+1,i-1);
    if(!flagBT)
        isBT(i,j-1);
    return;
}
void isMBT(int start,int endd)
{
    if(start>=endd)
        return;
    int root=nums[start];
    int i;
    for(i=start+1;i<=endd;++i){
        if(nums[i]<root)
            break;
    }
    int j;
    for(j=i;j<=endd;++j){
        if(nums[j]>=root){
            flagMBT=1;
            break;
        }
    }
    if(!flagMBT)
        isMBT(start+1,i-1);
    if(!flagMBT)
        isMBT(i,j-1);
    return;
}
void printBT(int start,int endd)
{
    if(start>endd)
        return;
    int root=nums[start];
    int i;
    for(i=start+1;i<=endd;++i){
        if(nums[i]>=root)
            break;
    }
    printBT(start+1,i-1);
    printBT(i,endd);
    if(coutflag)
        cout<<" ";
    coutflag=1;
    cout<<root;
    return;
}
void printMBT(int start,int endd)
{
    if(start>endd)
        return;
    int root=nums[start];
    int i;
    for(i=start+1;i<=endd;++i){
        if(nums[i]<root)
            break;
    }
    printMBT(start+1,i-1);
    printMBT(i,endd);
    if(coutflag)
        cout<<" ";
    coutflag=1;
    cout<<root;
    return;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>nums[i];
    }
    isBT(0,n-1);
    isMBT(0,n-1);
    if(flagBT&&flagMBT){
        cout<<"NO";//大写啊大写啊
    }else{
        cout<<"YES"<<endl;//大写啊大写啊
        if(!flagBT)
            printBT(0,n-1);
        else
            printMBT(0,n-1);
    }
    return 0;
}

上一篇下一篇

猜你喜欢

热点阅读