给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤)和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
一开始是想要建两棵树用来互相比较的,但是试了很多次都没能拿满分下面是几乎全仿浙江大学慕课数据结构课程的做法
//建一颗树,判别其他序列是否与其一致 #include <stdio.h> #include <stdlib.h> typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ typedef struct TreeNode *Tree; struct TreeNode { ElemType data; Tree left,right; int flag; //被访问过为1 否则0 }; Tree NewNode(ElemType data); Tree Insert(Tree T,ElemType data); Tree MakeTree(int N); bool check (Tree T,ElemType data); int Judge(Tree T,int N); void ResetT(Tree T); void FreeTree(Tree T); Tree NewNode(ElemType data) { Tree T = (Tree)malloc(sizeof(struct TreeNode)); T->data = data; T->left = T->right = NULL; T->flag = 0; return T; } Tree Insert(Tree T,ElemType data) { if( !T ) T = NewNode(data); else { if(data > T->data) T->right = Insert(T->right, data); else T->left = Insert(T->left, data); } return T; } Tree MakeTree(int N) { Tree T; ElemType data; scanf("%d",&data); T = NewNode(data); for(int i = 1; i < N; i++) { scanf("%d",&data); T = Insert(T,data); } return T; } bool check (Tree T,ElemType data) { if(T->flag) { if(data < T->data) return check(T->left,data); else if(data > T->data) return check(T->right,data); }else { if(data == T->data) { //是要找的结点 T->flag = 1; return true; } else return false; //不是 不一致 } } int Judge(Tree T,int N) { ElemType data; int flag = 0;//0代表目前仍一致 1代表已经不一致 scanf("%d",&data); if(data != T->data) // 判断根节点是否一致 flag = 1; else T->flag = 1; for(int i = 1; i < N; i++) { //确保L读完 scanf("%d",&data); if( (!flag) && (!check(T,data)) ) //不一致 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; Tree T; scanf("%d",&N); while(N) { scanf("%d",&L); T = MakeTree(N); for(int 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; }
原文地址:https://www.cnblogs.com/yuxiaoba/p/8331404.html
时间: 2024-11-03 01:23:48