04-树4 是否同一棵二叉搜索树 (25 分)

注意:
这道题主要考察:
1.二叉搜索树的表示
2.如何建立一颗二叉搜索树;即搜索树的初始化;
3.采用递归的方法向二叉搜索树里面插入节点;
4.思想:后来的序列在搜索树里面递归查找,每查找到一个节点就把该节点的flag置1,表示访问过;如果一个序列里面的某个值的寻找过程中经过了未曾访问过的节点,则这棵树一定不同构。

#include <iostream>
using namespace std;

//二叉搜索树的表示
typedef struct TreeNode * Tree;
struct TreeNode {
	Tree Left, Right;
	int flag;  //该节点访问过的设为1
	int data;
};

Tree NewNode(int t) {
	Tree T;
	T = new struct TreeNode;
	T->flag = 0;
	T->Left = T->Right = NULL;
	T->data = t;
	return T;
}

Tree insert(int t,Tree T) {
	if (!T) {
		T = NewNode(t); //任何插入的第一步,要先判断是否为空
	}
	else
	{
		if (t > T->data) {
			T->Right = insert(t, T->Right);
		}
		else {
			T->Left = insert(t, T->Left);
		}
	}
	return T;
}

Tree BuildTree(int N) {
	Tree T;
	int t;
	cin >> t;
	T = NewNode(t);
	for (int i = 1; i < N; i++)
	{
		cin >> t;
		T = insert(t, T);
	}
	return T;
}

int check(Tree T, int t) {
	
	if (T->flag) { //该节点已经被查找过,到它的左子树或者右子树寻找
		if(t<T->data)return check(T->Left, t);
		else return check(T->Right, t);
	}
	else {
		if (T->data == t) {
			T->flag = 1;
			return 1;
		}
		else return 0;
	}
}


int Judge(Tree T, int N) {//当发现某个序列不一致的时候,必须全部序列读完才return
	int t;
	int flag = 0;
	for (int i = 0; i < N; i++) {
		cin >> t;
		if ((!check(T,t))&&(!flag))
			flag = 1;
	 }
	return (!flag);
}
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() {
	int N, L;
	cin >> N;
	while (N)
	{
		cin >> L;
		Tree T = BuildTree(N);
		for (int i = 0; i < L; i++)
		{
			if (Judge(T, N))cout << "Yes"<<endl;
			else cout << "No" << endl;
			ResetT(T);//flag清零
		}
		FreeTree(T);//把树的节点释放掉
		cin >> N;
	}
	
	system("pause");
	return 0;
}   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值