算法笔记--二叉搜索树--判断两序列是否为同一二叉搜索树序列

题目来源:牛客网

1.二叉搜索树的定义及性质

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)

它或者是一棵空树,或者是具有下列性质的二叉树:

(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)它的左、右子树也分别为二叉排序树。

2.题目描述

算法笔记--二叉搜索树--判断两序列是否为同一二叉搜索树序列_第1张图片

题目分析:

(1)将每个序列都构造成一个二叉搜索树;

(2)判断两个序列是否能组成同一颗二叉搜索树,判断方法:

         对二叉排序树而言,相同元素的二叉排序树中序遍历一定相同,而不同元素二叉排序树使用前序遍历就可以发现不相同,所以只需要前序遍历两个二叉树,比较一下就可以判断

(3)将给定序列构造成一颗二叉排序树,利用for循环依次比对中序遍历

代码:

#include
#include
#include
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(xdata){
		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

代码分析:

(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(xdata){
		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

                 若str1>str2,则返回正数。

     使用时要添加头文件#include

 

你可能感兴趣的:(算法学习)