二叉排序树(oj2482)

来源:互联网 发布:微服务架构 java框架 编辑:程序博客网 时间:2024/06/07 20:42

二叉排序树

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树

输入

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)

输出

 

示例输入

21234567899876543214321567890

示例输出

NONO

 

#include <stdio.h>#include <string.h>#include <stdlib.h>char a[100], b[100];char I1[100], P1[100], I2[100], P2[100];int N;struct node{    char data;    node *lch,*rch;};void creat(node *&t,char n) {    if(t){        if(n<t->data)creat(t->lch,n);        else            creat(t->rch,n);    }    else    {        t=new node ;        t->data=n;        t->lch=NULL;        t->rch=NULL;    }}void inorder(node *&t,char I[]){    if(t)    {        inorder(t->lch,I);        I[N++]=t->data;        inorder(t->rch,I);    }}void posorder(node *&t,char P[]){    if(t)    {        posorder(t->lch,P);        posorder(t->rch,P);        P[N++]=t->data;    }}int main(){    int n,t;    while(scanf("%d",&n),n)    {    memset(a,0,sizeof(a));        scanf("%s",a);      t=strlen(a);      int i;      node *t1;      t1=NULL;      for(i=0;i<t;i++)      {          creat(t1,a[i]);      }      N=0;      inorder(t1,I1);      I1[N]='\0';       N=0;      posorder(t1,P1);      P1[N]='\0';      while(n--)      {   memset(b,0,sizeof(b));          scanf("%s",b);          t=strlen(b);          if(strlen(a)!=strlen(b))printf("NO\n");          else           {       node *t2;       t2=NULL;      for(i=0;i<t;i++)      {          creat(t2,b[i]);      }      N=0;      inorder(t2,I2);      I2[N]='\0';       N=0;      posorder(t2,P2);      P2[N]='\0';      if(strcmp(I1,I2)||strcmp(P1,P2))printf("NO\n");      else        printf("YES\n");           }      }    }    return 0;} 


 

0 0
原创粉丝点击