给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数NNN (≤10\le 10≤10)和LLL,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出NNN个以空格分隔的正整数,作为初始插入序列。最后LLL行,每行给出NNN个插入的元素,属于LLL个需要检查的序列。
简单起见,我们保证每个插入序列都是1到NNN的一个排列。当读到NNN为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
/*
Name: 树4 是否同一棵二叉搜索树.cpp
Copyright:
Author: xuuyann
Date: 23/10/18 11:03
Description:
*/
#include <stdio.h>
#include <stdlib.h>
#define ElementType int
#define MaxSize 10
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {
ElementType Data;
BinTree Left;
BinTree Right;
};
typedef struct CNode *PtrToCNode;
typedef PtrToCNode CList;
struct CNode {
ElementType Element;
PtrToCNode Next;
};
BinTree Insert(BinTree BST, ElementType X);//二叉搜索树的插入并返回插入结点
int CheckBST(BinTree BST_1, BinTree BST_2);//检查两棵二叉搜索树是否一样
void Attach(ElementType X, PtrToCNode *Check); //将检查得到的结果存入链表中
/***********************
1.插入
2.递归检查
************************/
int main()
{
int N, L, i, j;
ElementType a[MaxSize] = {0,};
ElementType b[MaxSize] = {0,};
BinTree T, T_1;
CList Check,head,temp;
T = (BinTree)malloc(sizeof(struct TNode));
T_1 = (BinTree)malloc(sizeof(struct TNode));
Check = (CList)malloc(sizeof(struct CNode));
head = Check; //检查链表的空表头
scanf("%d", &N);
while (N){
scanf("%d\n", &L);
scanf("%d", &a[0]);
T->Data = a[0]; //初始插入序列树的第一个数
T->Left = T->Right = NULL;
for (i=0; i<L; i++){
if (i == 0){
for (j=1; j<N; j++){
scanf("%d", &a[j]);
T = Insert(T, a[j]); //将结点插入初始二叉搜索树中
}
}
scanf("%d", &b[0]);
T_1->Data = b[0]; //待检查序列树的第一个数
T_1->Left = T_1->Right = NULL;
for (j=1; j<N; j++){
scanf("%d",&b[j]);
T_1 = Insert(T_1, b[j]); //将结点插入待检查二叉搜索树中
}
Attach(CheckBST(T, T_1), &Check);//将检查结果存入链表中,同一棵树记为1,不同记为0
}
scanf("%d",&N);
}
temp = head;
head = head->Next;
free(temp);
//遍历链表,检查结果
while(head){
if (head->Element){
printf("Yes\n");
head = head->Next;
}else{
printf("No\n");
head = head->Next;
}
}
return 0;
}
BinTree Insert(BinTree BST, ElementType X)
//二叉搜索树的插入并返回插入结点
{
if (!BST){
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
}
else{ //开始找要插入元素的位置
if (X < BST->Data )
BST->Left = Insert(BST->Left , X);
else if (X > BST->Data )
BST->Right = Insert(BST->Right , X);
}
return BST;
}
int CheckBST(BinTree BST_1, BinTree BST_2)
//检查两棵二叉搜索树是否一样
{
/********************************************
元素不一样 (与检查二叉树同构子程序差不多)
********************************************/
if (BST_1 == NULL && BST_2 == NULL) return 1;
if ((BST_1 == NULL && BST_2 != NULL) || (BST_1 != NULL && BST_2 == NULL))
return 0;
if (BST_1->Data != BST_2->Data ) return 0;
if (!BST_1->Left && !BST_2->Left )
return CheckBST(BST_1->Right ,BST_2->Right );
if ((BST_1->Left && BST_2->Left ) && (BST_1->Left->Data == BST_2->Left->Data ))
return CheckBST(BST_1->Left , BST_2->Left ) && CheckBST(BST_1->Right ,BST_2->Right );
else return 0;
}
void Attach(ElementType X, PtrToCNode *Check)
//将检查得到的结果存入链表中
{
CList P = (CList)malloc(sizeof(struct CNode));
P->Element = X;
P->Next = NULL;
(*Check)->Next = P;
*Check = P;
}
测试点均通过