http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2482&cid=1184
题目描述
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树
输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)
示例输入
2 123456789 987654321 432156789 0
示例输出
NO NO
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 //int mark=1; 5 typedef struct node 6 { 7 char data; 8 struct node *lchild,*rchild; 9 } BiTreeNode,*BiTree; 10 char sh[51],sh1[51],sh2[51]; 11 char ch[51]; 12 int count=0; 13 int BSTinsert(BiTree *T,char x);//建立排序二叉树,也就是所谓的插入操作。 14 void InOrderTraverse(BiTree T);//二叉树的先序遍历,不知道为什么用中序会错误 15 int judge(char a[],char b[]); 16 int main() 17 { 18 int len; 19 int n; 20 while(scanf("%d",&n)&&n) 21 { 22 count=0;//我错了5遍,都是因为没有在这里再归0一遍,因为是多组输入,所以这里必须有这句话,要不然以后的会覆盖 23 BiTree T=NULL,T1; 24 scanf("%s",ch); 25 int len1 = strlen(ch); 26 for(int i=0;i<=len1-1;i++) 27 { 28 BSTinsert(&T,ch[i]); 29 } 30 InOrderTraverse(T); 31 sh1[count]='\0';//这里要加结束符 32 strcpy(sh2,sh1);//因为在下面的操作中sh1的值会被覆盖,所以在这里的话要提前赋值给sh2; 33 for(int i=1;i<=n;i++) 34 { 35 count=0; 36 T1=NULL; 37 memset(sh1,0,sizeof(sh1)); 38 scanf("%s",sh); 39 len=strlen(sh); 40 for(int j=0;j<=len-1;j++) 41 { 42 BSTinsert(&T1,sh[j]); 43 } 44 InOrderTraverse(T1); 45 sh1[count]='\0'; 46 int flag=judge(sh1,sh2); 47 if(flag) 48 printf("YES\n"); 49 else 50 printf("NO\n"); 51 } 52 } 53 return 0; 54 } 55 int judge(char a[],char b[]) 56 { 57 if(strcmp(a,b)==0) 58 return 1; 59 else 60 return 0; 61 } 62 int BSTinsert(BiTree *T,char x) 63 { 64 BiTreeNode *p,*cur,*parent=NULL; 65 cur=*T; 66 while(cur!=NULL) 67 { 68 parent=cur; 69 if(x<cur->data) 70 cur=cur->lchild; 71 else 72 cur=cur->rchild; 73 } 74 p=(BiTreeNode *)malloc(sizeof(BiTreeNode)); 75 p->data=x; 76 p->lchild=NULL; 77 p->rchild=NULL; 78 if(!parent) 79 *T=p; 80 else if(x<parent->data) 81 parent->lchild=p; 82 else 83 parent->rchild=p; 84 return 1; 85 } 86 void InOrderTraverse(BiTree T) 87 { 88 if(T) 89 { 90 sh1[count++] = T->data; 91 InOrderTraverse(T->lchild); 92 InOrderTraverse(T->rchild); 93 } 94 }