zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",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
    ");
            postOrder(0);
        }
        else{
            init();
            if(solveMirrorBST(0,n-1,-1,-1)){
                printf("YES
    ");
                postOrder(0);
            }
            else{
                printf("NO
    ");
            }
    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    java数组去重
    XMLBeans简记
    【转】JAVA中的多线程问题(高级面试中经常遇到)
    【转】马士兵_JAVA自学之路
    【摘】加载页面:您的网站如何导致访问者感染恶意软件
    iBatisNet学习笔记三:QuickStart
    知识点滴:持久层,DAO,API,DAL,BLL,DLL,csproj,sln
    新知识了解笔记:关于Ibatis,ORM等
    iBatisNet学习笔记一:配置
    Google Map API
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/6789220.html
Copyright © 2011-2022 走看看