二叉排序树
Time Limit: 1000MS Memory limit: 65536K
题目描述
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树
输入
开始一个数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 typedef struct tnode /*建立节点*/ 5 { 6 int data; 7 struct tnode *l,*r; 8 } tnode; 9 tnode *q; /*构造指针变量*/ 10 tnode *bt; 11 int temp; 12 char one[12],two[12]; 13 void insert(tnode **b,tnode *s)/*排序二叉树中插入节点*/ 14 { 15 if((*b)==NULL)(*b)=s; 16 else if(s->data==(*b)->data) return; 17 else if(s->data<(*b)->data) insert((&(*b)->l),s); 18 else if(s->data>(*b)->data) insert((&(*b)->r),s); 19 } 20 void creat(tnode *b) /*建立排序二叉树*/ 21 { 22 int i,len; 23 char str[12]; 24 scanf("%s",str); 25 len=strlen(str); 26 tnode *s; 27 bt=NULL; /*初始化二叉数*/ 28 s=(tnode *)malloc(sizeof(tnode)); 29 q=s; /*将根结点指针地址赋值给q*/ 30 for(i=0; i<len; i++) /*反复读入节点,直至-1结束*/ 31 { 32 s->data=str[i]; 33 s->l=NULL; 34 s->r=NULL; 35 insert(&bt,s);/*节点插入排序二叉树中*/ 36 s=(tnode *)malloc(sizeof(tnode)); 37 } 38 } 39 void preorder(tnode *p) /*先序遍历二叉树*/ 40 { 41 if(p) 42 { 43 two[temp++]=p->data; 44 preorder(p->l); 45 preorder(p->r); 46 } 47 } 48 void destroy(tnode *T)//销毁二叉树 49 { 50 if(T) 51 { 52 if(T->l) 53 destroy(T->l); 54 if(T->r) 55 destroy(T->r); 56 free(T); 57 T=NULL; 58 } 59 } 60 int main() /*主函数*/ 61 { 62 int n; 63 while(scanf("%d%*c",&n)&&n) 64 { 65 temp=0; 66 creat(bt); /*构造排序二叉树*/ 67 preorder(q); /*先序遍历排序二叉树*/ 68 destroy(q); 69 two[temp]='