您的位置:首页 > 其它

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

2015-10-03 15:55 337 查看
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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: