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;
}
原文地址:https://www.cnblogs.com/stepping/p/5670461.html