MOOC 小白专场 判断是否同一棵二叉搜索树

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
// 判断是否同一棵二叉搜索树
/*
	求解思路:
	1. 搜索树表示
	2. 建搜索树T 
	3. 判别一序列是否与搜索树一致
*/ 

// 搜索树表示
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;
}

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);
	}
	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;
	}
}

// 有bug版本 
//int Judge(Tree T, int N)
//{
//	int i, V;
//	
//	if(V != T->v)	return 0;
//	else	T->flag = 1;
//	
//	for(i = 1; i < N; ++ i)
//	{
//		scanf("%d", &V);
//		if(!check(T, V))	return 0;
//	}
//	return 1;
//}

int Judge(Tree T, int N)
{
	int i, V, flag = 0;
			/* flag: 0表示目前还一致, 1表示已经不一致 */
	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)	/* 清除T中各节点的flag标记 */ 
{
	if(T->Left)	ResetT(T->Left);
	if(T->Right)	ResetT(T->Right);
	T->flag = 0;
}

void FreeTree(Tree T)	/* 释放T的空间 */ 
{
	if(T->Left)	FreeTree(T->Left);
	if(T->Right)	FreeTree(T->Right);
	free(T);
}

int main()
{
	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);	// 清除T中的标记flag 
		}
		FreeTree(T);
		scanf("%d", &N);
	}
	
	return 0;
} 

/*
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
*/

  

posted @ 2019-09-16 21:20  青衫客36  阅读(176)  评论(0编辑  收藏  举报