二叉搜索树
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2926 Accepted Submission(s): 1280
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
Source
浙大计算机研究生复试上机考试-2010年
二叉搜索树,又称二叉排序树,其实就是具有有序性的二叉树,此处有序性的意思是,左节点相对于根节点小,根节点相对于右节点小,(当然,这里也可以是大,同时这里的关系还可以是其他!)这种树的优点在于,利用中序遍历的时候,整颗树是按照一定的优先级顺序排列的,而且它的结构决定的它的节点的插入、删除工作相对来讲实现起来比较容易!
二叉搜索树,又称二叉排序树,其实就是具有有序性的二叉树,此处有序性的意思是,左节点相对于根节点小,根节点相对于右节点小,(当然,这里也可以是大,同时这里的关系还可以是其他!)这种树的优点在于,利用中序遍历的时候,整颗树是按照一定的优先级顺序排列的,而且它的结构决定的它的节点的插入、删除工作相对来讲实现起来比较容易!
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cstdlib>
using namespace std;
char s1[15],s2[15];int cnt;
struct node{
char num;
struct node*left;
struct node*right;
node(){
left=NULL;
right=NULL;
}
};
struct node*creat(char x)
{
node*t=(node*)malloc(sizeof(struct node));
t->num=x;
t->left=NULL,t->right=NULL;
return t;
}
struct node *root;
node* inseret(node* s,char x ) //这个递归实现二叉排序树的建立方法实在高效,思想是如果有子节点就按照左边小右边大的顺序遍历直到没结点,
这个时候就应该再新建一个结点
{ node*t;
if(s==NULL)
{
t=creat(x);
s=t;
}
else
{
if(x<=s->num)
s->left=inseret(s->left,x);
else
s->right=inseret(s->right,x);
}
return s;
}
void bianli(node*tree)
{
if(tree!=NULL)
{
s1[cnt++]=tree->num;
bianli(tree->left);
bianli(tree->right);
}
}
int main()
{ //freopen("input.txt","r",stdin);
int n;
while(scanf("%d",&n)&&n)
{ root=NULL;
char str1[15];
scanf("%s",str1);
for(int i=0;i<strlen(str1);i++)
{
root=inseret(root,str1[i]);
}
cnt=0;
bianli(root);
strcpy(s2,s1);
for(int i=1;i<=n;i++)
{
scanf("%s",str1);
root=NULL;
for(int j=0;j<strlen(str1);j++)
{
root=inseret(root,str1[j]);
}
cnt=0;
bianli(root);
if(strcmp(s1,s2)==0)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}