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

 

转载于:https://www.cnblogs.com/luyingfeng/p/3224585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值