(c语言详解)04-树4 是否同一棵二叉搜索树(详细解释)

本实验源于浙江大学《数据结构》。在这里插入图片描述
本实验源于浙江大学《数据结构》。这道题在小白专场也专门叙述过,逻辑是是否清晰的,主要包含以下函数:

  • 主函数负责整个流程
  • 创建树的结点函数
  • 检查是否同一颗搜索树
  • 插入树结点的函数
  • 创建树根不断输入叶节点的函数
  • judge控制check流程函数
  • 重置树
  • 释放树

Main函数

main函数主要涉及输入–处理–输出的过程
具体的处理肯定是要交给子函数去判断。
题目中输入的第一个是结点的个数,第二个是要判断的次数。
比如 4 2 也就是我有四个结点,接受两次判断。因此4也就是第一个参数也就是树的结点个数,也是for循环不断++的保证,2也就是判断次数也可以用循环来计数。最后输入0为终结也不要忘了哟!中间调用Judge函数进行判断,每判断一次不忘记输出到底是yes或者No。

树的表示

最普通的表示方法。左孩子右孩子+数据,最后来个flag判断是否同一颗二叉树所用到的标记。

创建树函数

利用maketree函数创建为n,将第一个结点设为根节点(NewNode()函数),然后依次为基础开始建造树,每次的结点用插入函数(Insert)

插入函数

按照定义进行插入,如果大于怎么样,如果小于怎么样,在根的时候不要忘记把结点NewNode一下。

判断函数

判断主要由check和Judge函数.将判断的数据依次输入到judge里,然后先判断根节点。然后由check函数进行递归判断,这里递归判断还是要记得,左子树的定义与右子树的定义。

重置与释放树

先递归然后在根节点释放,假想成后序遍历树。


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct TreeNode *Tree;
struct TreeNode{
	int v;
	Tree Left,Right;
	int flag;
};
Tree NewNode(int V){
	Tree T=(Tree)malloc(sizeof(struct TreeNode));
	T->v=V;
	T->Left=T->Right=NULL;
	T->flag = 0;
	return T;
}
int check(Tree T,int V)
{
	if(T->flag){
		if(V<T->v)
			return check(T->Left,V);
		else if(V>T->v)
			return check(T->Right,V);
		else
			return 0;
	}else{
		if(V==T->v){
			T->flag = 1;
			return 1;
		}else 
			return 0;
	}
}
Tree Insert(Tree T,int V){
	if(!T) T = NewNode(V);
	else{
		if(V>T->v)
			T->Right = Insert(T->Right,V);
		else
			T->Left = Insert(T->Left,V);
		
	}
	return T;
}
Tree MakeTree(int N)
{
	Tree T;
	int i,V;
	scanf("%d",&V);
	T = NewNode(V);
	for(i=1;i<N;i++){
		scanf("%d",&V);
		T = Insert(T,V);
	}
}

int Judge(Tree T,int N)
{
	int i,V,flag=0;
	scanf("%d",&V);
	if(V!=T->v) flag=1;
	else T->flag =1;
	
	for(i=1;i<N;i++){
		scanf("%d",&V);
		if((!flag)&&(!check(T,V)))flag=1;
	}
	if(flag)return 0;
	else return 1;
}
void ResetT(Tree T){
	if(T->Left) ResetT(T->Left);
	if(T->Right) ResetT(T->Right);
	T->flag=0;
}
void FreeTree(Tree T){
	if(T->Left) FreeTree(T->Left);
	if(T->Right) FreeTree(T->Right);
	free(T);
}
int main()
{
	//对每组数据
		//读入N和L
		//根据第一行序列建树T
		//依据树T分别判别后面的L个序列是否能与T形成同一搜索树并输出结果
	//需要设计的主要函数
		//读数据建搜索树T
		//判别一序列是否与T构成1样的搜索树
	int N,L,i;
	Tree T;
	scanf("%d",&N);
	while(N){
		scanf("%d",&L);
		T = MakeTree(N);
		for(i=0;i<L;i++){
			if(Judge(T,N))printf("Yes\n");
			else printf("No\n");
			ResetT(T);
			
		}
		FreeTree(T);
		scanf("%d",&N);
	}
	
	return 0;
	
}
发布了137 篇原创文章 · 获赞 30 · 访问量 8854

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/105469725
今日推荐