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

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

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数N (10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

Yes
No
No
 
  • 时间限制:400ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:陈越
  • 单位:浙江大学

题目判定

/* 
5-4 是否同一棵二叉搜索树  (25分)
http://pta.patest.cn/pta/test/15/exam/4/question/712
*/  
#include <cstdio>  
#include <cstdlib>  
#include <iostream>  
#include <vector>  
#include <queue>  
#include <map>  
#include <algorithm>  
#include <set>  
#include <string>  
  
using namespace std;  
  
#define N 1005  
 
int n , m ;

typedef struct node{
	int data ;
	struct node* left ;
	struct node* right ;
	node(int _data = -1)
	{
		data = _data ;
		left = NULL ;
		right = NULL ;
	}
}Bnode;

// 二叉排序树 插入 建树
Bnode* createTree(Bnode* root,int data)
{
	if(root == NULL)
		root = new node(data);
	else{
		if(data < root->data )
			root->left = createTree( root->left,data);
		if(data > root->data)
		{
			root->right = createTree( root->right,data);
		}
	}
	return root ;
}

// 递归判断两棵树 是否是一摸一样的
bool isSame(Bnode* root , Bnode* root2)
{
	if(root == NULL && root2 == NULL)
	{
		return true;
	}
	else if(root == NULL && root2 != NULL)
	{
		return false;
	}
	else if(root != NULL && root2 == NULL)
	{
		return false;
	}
	else if(root->data != root2->data)
		return  false;
	else{
		bool flag1 = isSame(root->left , root2->left);
		if(flag1){
			bool flag2 = isSame(root->right , root2->right) ;
			if(flag2)
				return true;
		}
		return false;
	}
}

int main()  
{  
    //freopen("in.txt","r",stdin);  
    //freopen("out.txt","w",stdout);  
	while(scanf("%d",&n) != EOF && n != 0)
	{
		scanf("%d",&m);
		int i , tmpn ;
		Bnode* root = NULL ;
		for(i = 0 ; i < n ; i++)
		{
			scanf("%d",&tmpn);
			root = createTree(root,tmpn);
		}
		while(m --)
		{
			Bnode* root2 = NULL ;
			for(i = 0 ; i < n ; i++)
			{
				scanf("%d",&tmpn);
				root2 = createTree(root2,tmpn);
			}
			if(isSame(root , root2))
				printf("Yes\n");
			else
				printf("No\n");
		}
	}
    return 0 ;  
}  


你可能感兴趣的:(5-4 是否同一棵二叉搜索树 (25分))