团体程序设计天梯赛-练习集L2-004. 这是二叉搜索树吗

来源:互联网 发布:js杀破狼mp3微盘 编辑:程序博客网 时间:2024/04/30 17:24
L2-004. 这是二叉搜索树吗?
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

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

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

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

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

输入格式:

输入的第一行给出正整数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
思路:我们只需要提炼题意几个关键词,首先是根据二叉搜索树的三个特点建树,
也顺便将其镜像树(原来放左边的放右边)写出来,
然后对比一下其前序遍历是不是对应给出的数列,是就输出其后序遍历的数列。
  1 #include<bits/stdc++.h>  2 using namespace std;  3 //二叉搜索树特点:左节点比根节点小,右节点比根节点大   4 struct Node{  5     int data;  6     struct Node *l;  7     struct Node *r;  8 };  9 int s[1010],v[1010],tmp; 10 void create1(Node *root,int x){//建树  11     Node *p; 12     if(x<root->data){ 13             if(root->l==NULL){ 14                 p=new Node; 15                 p->data=x; 16                 p->l=NULL; 17                 p->r=NULL; 18                 root->l=p; 19                 return ; 20             } 21             else  22             create1(root->l,x); 23     } 24     else{ 25         if(root->r==NULL){ 26             p=new Node; 27             p->data=x; 28             p->l=NULL; 29             p->r=NULL; 30             root->r=p; 31             return ; 32         } 33         else 34         create1(root->r,x); 35     } 36 } 37 void create2(Node *root,int x){//镜像树  38     Node *p; 39     if(x>=root->data){ 40             if(root->l==NULL){ 41                 p=new Node; 42                 p->data=x; 43                 p->l=NULL; 44                 p->r=NULL; 45                 root->l=p; 46                 return ; 47             } 48             else  49             create2(root->l,x); 50     } 51     else{ 52         if(root->r==NULL){ 53             p=new Node; 54             p->data=x; 55             p->l=NULL; 56             p->r=NULL; 57             root->r=p; 58             return ; 59         } 60         else 61         create2(root->r,x); 62     } 63 } 64 void firstvisit(Node *p){//前序遍历:根左右  65     if(p!=NULL){ 66         v[tmp++]=p->data; 67         firstvisit(p->l); 68         firstvisit(p->r); 69     } 70 } 71 void lastvisit(Node *p){//后序遍历:左右根  72     if(p!=NULL){ 73         lastvisit(p->l); 74         lastvisit(p->r); 75         v[tmp++]=p->data; 76     } 77 } 78 int main(){ 79     int n,flag; 80     Node *root,*toor; 81     root=NULL; 82     scanf("%d",&n); 83     for(int i=0;i<n;i++){ 84         scanf("%d",&s[i]); 85         if(i==0)//根节点  86         { 87             root=new Node; 88             root->data=s[i]; 89             root->l=NULL; 90             root->r=NULL; 91             toor=new Node; 92             toor->data=s[i]; 93             toor->l=NULL; 94             toor->r=NULL; 95         } 96         else{ 97             create1(root,s[i]); 98             create2(toor,s[i]); 99         }100     }101     tmp=0;102     flag=1;103     firstvisit(root);104     for(int i=0;i<n;i++){105         if(s[i]!=v[i]){106             flag=0;107             break;108         }109     }110     if(flag==1){111         printf("YES\n");112         tmp=0;113         lastvisit(root);114         printf("%d",v[0]);115         for(int i=1;i<n;i++)116         printf(" %d",v[i]);117         118     }119     else{120         tmp=0;121         flag=1;122         firstvisit(toor);123         for(int i=0;i<n;i++){124             if(s[i]!=v[i]){125                 flag=0;126                 break;127             }128         }129         if(flag==1){130             printf("YES\n");131             tmp=0;132             lastvisit(toor);133             printf("%d",v[0]);134             for(int i=1;i<n;i++)135             printf(" %d",v[i]);136         }137         else138         printf("NO\n");139     }140     return 0;141 }

 

0 0
原创粉丝点击