二叉排序树
Problem Description
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)
Output
Sample Input
2
123456789
987654321
432156789
0
Sample Output
NO
NO
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
typedef struct treenode
{
char data;
struct treenode*l,*r;
}tree;//改名字,少打两个字嘻嘻嘻
char a[30];
char b[30];
tree *plant(char x,tree*t)//排序树的建立
{
if(t==NULL)
{
t=(tree*)malloc(sizeof(tree));
t->data=x;
t->l=t->r=NULL;
return t;
}
if(x<t->data)
{
t->l=plant(x,t->l);
}else
{
t->r=plant(x,t->r);
}
return t;
};
int k;//定义标记变量k来判断是否为同一棵树
void judge(tree*atree,tree*btree)
{
if(atree&&btree)
{
if(atree->data!=btree->data)
{
k=1;
return;
}
judge(atree->l,btree->l);//若相等则递归判断左子树
judge(atree->r,btree->r);//若相等则递归判断右子树
}
}
int main()
{
int i,n,len1,len2;
while(~scanf("%d",&n)&&n)//若n==0跳出循环
{
scanf("%s",a);
len1=strlen(a);
tree*atree=NULL;//注意这个坑,要把树初始化
for(i=0;i<len1;i++)
{
atree=plant(a[i],atree);
}
while(n--)
{
tree*btree=NULL;//同样注意
scanf("%s",b);
len2=strlen(b);
k=0;//记得每次都要初始化标记变量k=0
for(i=0;i<len2;i++)
{
btree=plant(b[i],btree);
}
judge(atree,btree);
if(k)//若k=1则说明不是同一棵树
{
printf("NO\n");
}else
{
printf("YES\n");
}
}
}
return 0;
}