zoukankan      html  css  js  c++  java
  • PAT (天梯)L2004. 这是二叉搜索树吗?

    L2-004. 这是二叉搜索树吗?

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

    一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,

    • 其左子树中所有结点的键值小于该结点的键值;
    • 其右子树中所有结点的键值大于等于该结点的键值;
    • 其左右子树都是二叉搜索树。

    所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。

    给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。

    输入格式:

    输入的第一行给出正整数N(<=1000)。随后一行给出N个整数键值,其间以空格分隔。

    输出格式:

    如果输入序列是对一棵二叉搜索树或其镜像进行前序遍历的结果,则首先在一行中输出“YES”,然后在下一行输出该树后序遍历的结果。数字间有1个空格,一行的首尾不得有多余空格。若答案是否,则输出“NO”。

    输入样例1:
    7
    8 6 5 7 10 8 11
    
    输出样例1:
    YES
    5 7 6 8 11 10 8
    
    输入样例2:
    7
    8 10 11 8 6 7 5
    
    输出样例2:
    YES
    11 8 10 7 5 6 8
    
    输入样例3:
    7
    8 6 8 5 10 9 11
    
    输出样例3:
    NO
    #include <iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    struct node
    {
        int num,left,right;
    }tree[1005];
    int i,j,n;
    int a[1005],b[1005],l;
    void buildtree(int k)
    {
        if (k>n) return;
        tree[++l].num=a[k];
        tree[l].left=-1;
        tree[l].right=-1;
        int i=1;
        while(1)
        {
            while(a[k]<tree[i].num && tree[i].left!=-1) i=tree[i].left;
            if (tree[i].left==-1 && a[k]<tree[i].num)
            {
                tree[i].left=l;
                break;
            }
            while(a[k]>=tree[i].num && tree[i].right!=-1) i=tree[i].right;
            if (tree[i].right==-1 && a[k]>=tree[i].num)
            {
                tree[i].right=l;
                break;
            }
        }
      buildtree(k+1);
      return ;
    }
    void work1(int k)
    {
        b[++l]=tree[k].num;
        if (tree[k].left!=-1) work1(tree[k].left);
        if (tree[k].right!=-1) work1(tree[k].right);
        return;
    }
    void work2(int k)
    {
        b[++l]=tree[k].num;
        if (tree[k].right!=-1) work2(tree[k].right);
        if (tree[k].left!=-1) work2(tree[k].left);
        return;
    }
    void cal1(int k)
    {
        if (tree[k].left!=-1) cal1(tree[k].left);
        if (tree[k].right!=-1) cal1(tree[k].right);
        b[++l]=tree[k].num;
        return;
    }
    void cal2(int k)
    {
        if (tree[k].right!=-1) cal2(tree[k].right);
        if (tree[k].left!=-1) cal2(tree[k].left);
        b[++l]=tree[k].num;
        return;
    }
    int main()
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
    
        tree[1].num=a[1];
        tree[1].left=-1;
        tree[1].right=-1;
        l=1;
        buildtree(2);
        //for(i=1;i<=n;i++)
        //  printf("%d:%d %d\n",tree[i].num,tree[tree[i].left].num,tree[tree[i].right].num);
        l=0;
        memset(b,0,sizeof(b));
        work1(1);
    
        for(i=1;i<=n;i++)
            if (a[i]!=b[i]) break;
        if(i>n)  {
                    printf("YES\n");
                    memset(b,0,sizeof(b));
                    l=0;
                    cal1(1);
                    for(i=1;i<n;i++) printf("%d ",b[i]);
                    printf("%d\n",b[n]);
                 }
                 else
                 {
                     l=0;
                     memset(b,0,sizeof(b));
                     work2(1);
                      for(i=1;i<=n;i++)
                          if (a[i]!=b[i]) break;
                      if (i>n) {
                                    printf("YES\n");
                                    memset(b,0,sizeof(b));
                                    l=0;
                                    cal2(1);
                                    for(i=1;i<n;i++) printf("%d ",b[i]);
                                    printf("%d\n",b[n]);
                               }
                                else printf("NO\n");
                 }
        return 0;
    }
  • 相关阅读:
    nginx教程2:日志
    3.1.1 基于监听的事件处理机制
    示例(1)按键和文本框监听
    2.3.3 Button(按钮)与ImageButton(图像按钮)
    2.3.2 EditText(输入框)详解
    2.3.1 TextView(文本框)详解
    2.2.3 TableLayout(表格布局)
    2.2.2 RelativeLayout(相对布局)
    2.2.1 LinearLayout(线性布局)
    2.1 View与ViewGroup的概念
  • 原文地址:https://www.cnblogs.com/stepping/p/5670461.html
Copyright © 2011-2022 走看看