这是二叉搜索树吗?

来源:互联网 发布:java 异步方法 编辑:程序博客网 时间:2024/05/16 05:55

PAT上的一道题目

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

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

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

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

输入格式:

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

输出格式:

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

输入样例1:
78 6 5 7 10 8 11
输出样例1:
YES5 7 6 8 11 10 8
输入样例2:
78 10 11 8 6 7 5
输出样例2:
YES11 8 10 7 5 6 8
输入样例3:
78 6 8 5 10 9 11
输出样例3:
NO

思路:构造出对应二叉树先序遍历出顺序和题目所给比较,不同则是NO,相同则YES再输出后序遍历结果。


#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>typedef struct node{    int data;    struct node *l;    struct node *r;}Node;int s[1010];int v[1010];int tmp;void create1(Node *root,int x)//构造原二叉树{    Node *p;    if(x<root->data)    {        if(root->l==NULL)        {            p = new Node;            p->data = x;            p->l = NULL;            p->r = NULL;            root->l = p;            return;        }        else            create1(root->l,x);    }    else    {        if(root->r==NULL)        {            p = new Node;            p->data = x;            p->l = NULL;            p->r = NULL;            root->r = p;            return;        }        else            create1(root->r,x);    }}void create2(Node *root,int x)//构造镜像二叉树{    Node *p;    if(x>=root->data)    {        if(root->l==NULL)        {            p = new Node;            p->data = x;            p->l = NULL;            p->r = NULL;            root->l = p;            return;        }        else            create2(root->l,x);    }    else    {        if(root->r==NULL)        {            p = new Node;            p->data = x;            p->l = NULL;            p->r = NULL;            root->r = p;            return;        }        else            create2(root->r,x);    }}void firstvisit(Node *p){    if(p!=NULL)    {        v[tmp++] = p->data;        firstvisit(p->l);        firstvisit(p->r);    }}void lastvisit(Node *p){    if(p!=NULL)    {        lastvisit(p->l);        lastvisit(p->r);        v[tmp++] = p->data;    }}int main(){    int n,flag;    Node *root,*toor;    root = NULL;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&s[i]);        if(i==0)//构造根节点        {            root = new Node;            root->data = s[i];            root->l = NULL;            root->r = NULL;            toor = new Node;            toor->data = s[i];            toor->l = NULL;            toor->r = NULL;        }        else        {            create1(root,s[i]);            create2(toor,s[i]);        }    }    tmp = 0;    flag = 1;    firstvisit(root);    for(int i=0;i<n;i++)    {        if(s[i]!=v[i])        {            flag = 0;break;        }    }    if(flag==1)    {        printf("YES\n");        tmp=0;        lastvisit(root);        for(int i=0;i<n;i++)        {            printf("%d",v[i]);            if(i!=n-1)                printf(" ");        }    }    else    {        tmp=0;        flag =1;        firstvisit(toor);        for(int i=0;i<n;i++)        {            if(s[i]!=v[i])            {                flag=0;break;            }        }        if(flag==1)        {            printf("YES\n");            tmp=0;            lastvisit(toor);            for(int i=0;i<n;i++)            {                printf("%d",v[i]);                if(i!=n-1)                    printf(" ");            }        }        else            printf("NO");    }    return 0;}


0 0