思路:先说一下二叉搜索树吧 ,大的数字全都在右子树小的数全都在左子树,建立的时候以第一个树为核心比较 比他大则往右子树走然后在右边也按照相同的方法一直到树为NULL,左边也是一样。 这个题先根据第一个字符串建立一颗二叉搜索树。然后前序保存在一个数组。接着输入第二个字符串也前序保存另外一个数组,然后拿这两个字符串比较如果相同则yes不同则no
二叉搜索树
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Tree
{
char data;
struct Tree *lchild;
struct Tree *rchild;
}Tree,*BiTree;
int count;
int erchasousuo(char a,BiTree root,BiTree f,BiTree &p)\\f表示父亲节点。p用来传递父亲节点
{
if(root==NULL) { p=f;
return 0;}
if(a>root->data) {return erchasousuo(a,root->rchild,root,p);
}
else if(a<root->data){return erchasousuo(a,root->lchild,root,p);
}
else return 1;
}
void qianxu(Tree *root,char *a)
{
if(root==NULL) return;
a[count++]=root->data;
qianxu(root->lchild,a);
qianxu(root->rchild,a);
}
BiTree fun(char *a)//建立二叉搜索树
{ BiTree root=NULL;
for(int i=0;a[i];i++)//从第一个数字开始到\0;
{
BiTree p=NULL;
erchasousuo(a[i],root,NULL,p);
BiTree q=(Tree*)malloc(sizeof(Tree));
q->data=a[i];
q->lchild=NULL;
q->rchild=NULL;
if(p==NULL) {//当p等于空则表示是第一个数字。不需要比较
root=q;
}
else
{
if(q->data>p->data) p->rchild=q;//比较看是比父亲节点的数据大还是小。大则放在右边,小就放在左边。
else p->lchild=q;
}
}
return root;
}
int main()
{
char a[11],b[11],c[11]={0};
int n;
while(scanf("%d",&n)==1)
{if(n==0) break;
scanf("%s",a);
BiTree root=fun(a);
count=0;
memset(c,0,sizeof(c));
qianxu(root,c);
while(n--)
{
scanf("%s",b);
BiTree root=fun(b);
memset(b,0,sizeof(b));
count=0;
qianxu(root,b);
if(strcmp(b,c)==0)printf("YES\n");
else printf("NO\n");
}}
}