SDUT2482二叉排序树

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 }
View Code

 

你可能感兴趣的:(二叉排序树)