二叉排序树

二叉排序树

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]='\0';
70         strcpy(one,two);
71         while(n--)
72         {
73             temp=0;
74             creat(bt);                      /*构造排序二叉树*/
75             preorder(q);                /*先序遍历排序二叉树*/
76             destroy(q);
77             two[temp]='\0';
78             if(strcmp(two,one))
79                 printf("NO\n");
80             else
81                 printf("YES\n");
82         }
83     }
84     return 0;
85 }
View Code

不多说了,这题真心纠结,自己也是看着写的…………Orz

posted @ 2013-07-30 20:21  孔凡凯凯  阅读(320)  评论(0编辑  收藏  举报