题目来源:牛客网
1.二叉搜索树的定义及性质
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)
它或者是一棵空树,或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也分别为二叉排序树。
2.题目描述
题目分析:
(1)将每个序列都构造成一个二叉搜索树;
(2)判断两个序列是否能组成同一颗二叉搜索树,判断方法:
对二叉排序树而言,相同元素的二叉排序树中序遍历一定相同,而不同元素二叉排序树使用前序遍历就可以发现不相同,所以只需要前序遍历两个二叉树,比较一下就可以判断
(3)将给定序列构造成一颗二叉排序树,利用for循环依次比对中序遍历
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}node,*Tree;
int size;
node *Insert(node *T,char x){
if(T==NULL){
T = (node*)malloc(sizeof(node));
T->data=x;
T->lchild=T->rchild=NULL;
return T;
}
else if(x<T->data){
T->lchild = Insert(T->lchild,x);
}
else if(x>T->data){
T->rchild = Insert(T->rchild,x);
}
return T;
}
void PreOrder(node *T,char pre[]){
if(T!=NULL){
//printf("%d ",T->data);
pre[size++]=T->data;
pre[size]=0;
PreOrder(T->lchild,pre);
PreOrder(T->rchild,pre);
return ;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF&&n!=0){
node *T1,*T2;
getchar();
T1=NULL;
char str1[12],str2[12];
gets(str1);
for(int i =0;str1[i]!=0;i++){
T1=Insert(T1,str1[i]);
}
for(int i=0;i<n;i++){
T2=NULL;
gets(str2);
for(int i=0;str2[i]!=0;i++){
T2=Insert(T2,str2[i]);
}
char a[12],b[12];
PreOrder(T1,a);
size=0;
PreOrder(T2,b);
size=0;
puts(strcmp(a,b)==0?"YES":"NO");
}
}
return 0;
}
代码分析:
(1)二叉排序树的构造方法
二叉排序树是一个查找表,对于一个不存在于二叉排序树中的关键字,其查找不成功的位置即为该关键字的插入位置;
在插入过程中如果插入关键字已经存在,则判断应插入其左子树上还是右子树上,递归插入关键字;
若插入关键字不存在,则插入
node *Insert(node *T,char x){
if(T==NULL){
T = (node*)malloc(sizeof(node));
T->data=x;
T->lchild=T->rchild=NULL;
return T;
}
else if(x<T->data){
T->lchild = Insert(T->lchild,x);
}
else if(x>T->data){
T->rchild = Insert(T->rchild,x);
}
return T;
}
T=(node*)malloc(sizeof(node));//表示找到插入位置,创建新结点
(2)二叉树的先序遍历
void PreOrder(node *T,char pre[]){
if(T!=NULL){
pre[size++]=T->data;
pre[size]=0; //不知道为什么加这一句
PreOrder(T->lchild,pre);
PreOrder(T->rchild,pre);
return ;
}
}
用数组pre[]来记录先序遍历的结果
(3)主函数
1)定义两个数组,用于存放待比对的序列,用gets()或许输入的字符串
char str1[12],str2[12];
gets(str1);
2)定义两个数组,将先序遍历后的序列放入数组中,方便比对
放入数组后要将变量size置0,因为size为全局变量,否则会影响到数组b[]的存储
PreOrder(T1,a);
size=0;
3)用puts()输出结果,strcmp()函数比较两个字符串
puts(strcmp(a,b)==0?"YES":"NO");
strcmp函数介绍:
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
使用时要添加头文件#include<string.h>