二叉排序树

题目描述

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

输入

开始一个数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 struct node
 5 {
 6     char data;
 7     struct node *left,*right;
 8 };
 9 int ans;
10 //递归建立二叉排序树
11 void build(struct node **p,char ch)
12 {
13     if(*p == NULL)
14     {
15         *p = (struct node *)malloc(sizeof(struct node));
16         (*p)->data = ch;
17         (*p)->left = NULL;
18         (*p)->right = NULL;
19     }
20     else if((*p)->data > ch)
21         build(&(*p)->left,ch);
22     else build(&(*p)->right,ch);
23 }
24 //先序遍历二叉排序树
25 void preorder(struct node *p,char s[])
26 {
27     if(p == NULL)
28         return;
29     s[ans++] = p->data;
30     preorder(p->left,s);
31     preorder(p->right,s);
32 }
33 //释放内存
34 void del(struct node *p)
35 {
36     if(p == NULL) return;
37     del(p->left);
38     del(p->right);
39     free(p);
40 }
41 //把二叉排序树的先序遍历转化为字符串
42 void trans(char s[])
43 {
44     ans = 0;
45     struct node *root = NULL;
46     char number[11];
47     gets(number);
48     for(int i = 0; number[i] != '\0'; i++)
49     {
50         build(&root,number[i]);
51     }
52     preorder(root,s);
53     s[ans] = '\0';
54     del(root);
55 }
56 
57 int main()
58 {
59     int n;
60     char s[11],s1[11];
61     while(~scanf("%d%*c",&n) && n)
62     {
63         trans(s);
64         while(n--)
65         {
66             trans(s1);
67             if(strcmp(s,s1) == 0)
68                 printf("YES\n");
69             else printf("NO\n");
70         }
71     }
72     return 0;
73 }
View Code

 

posted on 2013-07-29 09:17  straw_berry  阅读(181)  评论(0编辑  收藏  举报