04-树4 是否同一棵二叉搜索树

本文介绍了一种通过输入创建二叉树的方法,并实现了一个用于判断两棵二叉树是否相同的算法。具体包括二叉树节点结构定义、二叉树构建、节点插入、树结构比较及资源释放等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>


typedef struct TreeNode{
	int data;
	struct TreeNode* Left;
	struct TreeNode* Right;
	int flag;
}TreeNode, *Tree;


Tree MakeTree(int N);
Tree NewTreeNode(int tmp);
Tree Insert(Tree T, int tmp);


int Judge(Tree T, int N);
int check(Tree T, int tmp);
void FreeTree(Tree T);
void ResetT(Tree T);


int main(int argc, char const *argv[])
{
	// freopen("test.txt", "r", stdin);
	int N, L;
	scanf("%d", &N);
	Tree T;
	while(N){
		scanf("%d", &L);
		T = MakeTree(N);
		for (int i = 0; i < L; ++i){
			if(Judge(T, N))//判断两棵数是否一样
				printf("Yes\n");
			else
				printf("No\n");
			ResetT(T);//重置T中标志flag为0
		}
		FreeTree(T);//释放分配的空间
		scanf("%d", &N);
	}
	return 0;
}


Tree MakeTree(int N)
{
	Tree T;
	int tmp;
	scanf("%d", &tmp);
	T = NewTreeNode(tmp);
	for (int i = 1; i < N; ++i){
		scanf("%d", &tmp);
		T = Insert(T, tmp);
	}
	return T;
}


Tree NewTreeNode(int tmp)
{
	Tree T = (Tree)malloc(sizeof(TreeNode));
	T->data = tmp;
	T->flag = 0;
	T->Left = T->Right = NULL;
	return T;
}


Tree Insert(Tree T, int tmp)
{
	if(!T)
		T = NewTreeNode(tmp);
	else{
		if(tmp > T->data)
			T->Right = Insert(T->Right, tmp);
		else
			T->Left = Insert(T->Left, tmp);
	}
	return T;
}


int Judge(Tree T, int N)
{
	int tmp, flag = 0;
	scanf("%d", &tmp);
	if(tmp != T->data)
		flag = 1;
	else
		T->flag = 1;
	for (int i = 1; i < N; ++i){
		scanf("%d", &tmp);
		if((!flag) && (!check(T, tmp)))
			flag = 1;
	}
	if(flag)
		return 0;
	else
		return 1;
}


int check(Tree T, int tmp)
{
	if(T->flag){
		if(tmp > T->data)
			return check(T->Right, tmp);
		else if(tmp < T->data)
			return check(T->Left, tmp);
		else
			return 0;
	}
	else{
		if(tmp == T->data){
			T->flag = 1;
			return 1;
		}
		else
			return 0;
	}
}


void FreeTree(Tree T)
{
	if(T->Left)
		FreeTree(T->Left);
	if(T->Right)
		FreeTree(T->Right);
	free(T);
}


void ResetT(Tree T)
{
	if(T->Left)
		ResetT(T->Left);
	if(T->Right)
		ResetT(T->Right);
	T->flag = 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值