PTA || 04-树4 是否同一棵二叉搜索树

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

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数NNN (≤10\le 1010)和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;
}

测试点均通过

猜你喜欢

转载自blog.csdn.net/qq_26565435/article/details/83303985