• PAT (Advanced Level) 1043. Is It a Binary Search Tree (25)


    简单题。构造出二叉搜索树,然后check一下。

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    const int maxn=100000+10;
    struct Node
    {
        int left;
        int right;
        int val;
    } s[maxn];
    
    int n;
    int a[maxn];
    int ans[maxn],tot;
    int h[maxn];
    int k;
    
    void dfs(int x)
    {
        ans[k++]=s[x].val;
        if(s[x].left!=-1) dfs(s[x].left);
        if(s[x].right!=-1) dfs(s[x].right);
    }
    
    void houxu(int x)
    {
        if(s[x].left!=-1) houxu(s[x].left);
        if(s[x].right!=-1) houxu(s[x].right);
        h[k++]=s[x].val;
    }
    
    bool check()
    {
        for(int i=0;i<n;i++) if(ans[i]!=a[i]) return 0;
        return 1;
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            for(int i=0; i<n; i++) scanf("%d",&a[i]);
            for(int i=0; i<=n; i++) s[i].left=s[i].right=-1;
            int id=0;
            s[id++].val=a[0];
            for(int i=1; i<n; i++)
            {
                int now=0;
                while(1)
                {
                    if(a[i]<s[now].val)
                    {
                        if(s[now].left!=-1) now=s[now].left;
                        else
                        {
                            s[now].left=id;
                            s[id++].val=a[i];
                            break;
                        }
                    }
                    else
                    {
                        if(s[now].right!=-1) now=s[now].right;
                        else
                        {
                            s[now].right=id;
                            s[id++].val=a[i];
                            break;
                        }
                    }
                }
            }
    
           // for(int i=0;i<id;i++) printf("%d %d %d
    ",s[i].val,s[i].left,s[i].right);
    
            k=0;
            dfs(0);
            if(check()==1)
            {
                printf("YES
    ");
                k=0; houxu(0);
                for(int i=0;i<n;i++)
                {
                    printf("%d",h[i]);
                    if(i<n-1) printf(" ");
                    else printf("
    ");
                }
                continue;
            }
    
            k=0;
            for(int i=0;i<n;i++) swap(s[i].left,s[i].right);
            dfs(0);
            if(check()==1)
            {
                printf("YES
    ");
                k=0; houxu(0);
                for(int i=0;i<n;i++)
                {
                    printf("%d",h[i]);
                    if(i<n-1) printf(" ");
                    else printf("
    ");
                }
                continue;
            }
    
            printf("NO
    ");
    
        }
        return 0;
    }
  • 相关阅读:
    回答提出的问题1-17章
    《构建之法》第13-17章读书笔记
    读《一个程序员的生命周期》有感
    构建之法的第十、十一、十二章读书笔记
    阅读《构建之法》第8,9,10章
    5.2-5.3
    作业5.1测试与封装
    读《构建之法》5.6.7 思考
    读《构建之法》的思考
    作业2 结对思则运算
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5526916.html
Copyright © 2020-2023  润新知