PAT甲题题解-1043. Is It a Binary Search Tree (25)-二叉搜索树

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/6789220.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~

 

题意:给出一个序列,问你是否是一棵二叉搜索树或者是其镜像的前序遍历。
并且输出其后序遍历。

一开始没考虑到只有一个子树...比如
BST
7
8 11 9 8 10 13 12
MIRROR
7
8 11 13 12 9 10 8
所以要先判断是否为BST,不是的话再判断是否为mirror BST
都不是输出NO

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#define LEFT 1
#define RIGHT 2

using namespace std;
const int maxn=1005;
int n;
int seq[maxn];
int cnt=0;
struct Node{
    int left=-1;
    int right=-1;
    int val;
}node[maxn];
/**
判断对应区间[l,r]是否为二叉搜索树
fa为其父亲节点
leftOrRight表示该子树为父亲节点的左孩子还是右孩子
*/
bool solveBST(int l,int r,int fa,int leftOrRight){
//printf("l:%d r:%d fa:%d leftorRight:%d\n",l,r,fa,leftOrRight);
    if(l>r)
        return true;
    if(l==r){
        node[cnt].val=seq[l];
        if(leftOrRight==LEFT){
            node[fa].left=cnt;
        }
        else{
            node[fa].right=cnt;
        }
        cnt++;
        return true;
    }
    node[cnt].val=seq[l];
    int val=seq[l];
    int id=cnt;

    if(fa!=-1){
        if(leftOrRight==LEFT){
            node[fa].left=cnt;
        }
        else{
            node[fa].right=cnt;
        }
    }
    cnt++;
    int i;
    for(i=l+1;i<=r;i++){
        if(seq[i]>=val){
            break;
        }
    }
    for(int j=i+1;j<=r;j++){
        //如果右子树应该都>=val,如果有小于的,那么就不是BST
//printf("seq[j]:%d val:%d\n",seq[j],val);
        if(seq[j]<val){
            return false;
        }
    }
    if(!solveBST(l+1,i-1,id,LEFT))
        return false;
    if(!solveBST(i,r,id,RIGHT))
        return false;
    return true;
}
/**
判断对应区间[l,r]是否为二叉搜索树的镜像
fa为其父亲节点
leftOrRight表示该子树为父亲节点的左孩子还是右孩子
*/
bool solveMirrorBST(int l,int r,int fa,int leftOrRight){
//printf("l:%d r:%d fa:%d leftorRight:%d\n",l,r,fa,leftOrRight);
    if(l>r)
        return true;
    if(l==r){
        node[cnt].val=seq[l];
        if(leftOrRight==LEFT){
            node[fa].left=cnt;
        }
        else{
            node[fa].right=cnt;
        }
        cnt++;
        return true;
    }
    node[cnt].val=seq[l];
    int val=seq[l];
    int id=cnt;

    if(fa!=-1){
        if(leftOrRight==LEFT){
            node[fa].left=cnt;
        }
        else{
            node[fa].right=cnt;
        }
    }
    cnt++;
    int i;
    for(i=l+1;i<=r;i++){
        if(seq[i]<val){
            break;
        }
    }
    for(int j=i+1;j<=r;j++){
        //mirror的右子树应该都是<val,如果不是,则不是mirror BST
        if(seq[j]>=val){
            return false;
        }
    }
    if(!solveMirrorBST(l+1,i-1,id,LEFT))
        return false;
    if(!solveMirrorBST(i,r,id,RIGHT))
        return false;
    return true;
}
bool first=true;
void postOrder(int u){
    if(u==-1)
        return;
    postOrder(node[u].left);
    postOrder(node[u].right);
    if(first){
        printf("%d",node[u].val);
        first=false;
    }
    else
        printf(" %d",node[u].val);
}
void init(){
    cnt=0;
    for(int i=0;i<maxn;i++){
        node[i].left=node[i].right=-1;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&seq[i]);
    }
    if(solveBST(0,n-1,-1,-1)){
        printf("YES\n");
        postOrder(0);
    }
    else{
        init();
        if(solveMirrorBST(0,n-1,-1,-1)){
            printf("YES\n");
            postOrder(0);
        }
        else{
            printf("NO\n");
        }

    }
    return 0;
}
View Code

 

posted @ 2017-04-30 12:34  辰曦~文若  阅读(361)  评论(0编辑  收藏  举报