历时两天找bug,最后一个bug找到怀疑人生。
题目:
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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
解题思路:1.先构造一个二叉搜索树,在用查找的方法用剩下的数据在二叉树里面查找数据,如果找到就设为1,如果在找到之前发现之前没有出现过的节点就说明二叉树不相同。然后退出将树清空,将的flag全部设为0;
遇到的问题:
- scanf("%d",&N);后面没有打上&号导致程序提前结束。
- if else 应用得不严谨 导致在数遍历的时候并没有将所有的数都跑完就跳出循环。
- 输出和标准答案格式大小写不相同。
下面是代码:
////建一颗树,判别其他序列是否与其一致
//#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;
//}
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef struct TreeNode *Tree;
struct TreeNode{
int Data;
Tree Left,Right;
int flag;
};
Tree BuildTree(int N);
int Judge(Tree T,int N);
int Check(Tree T,int Data);
void ReleaseTree(Tree T);
void ReleaseFlag(Tree);
Tree InsertTree(Tree t,int Data);
Tree NewNode(int Data);
void ReleaseTree(Tree T){
if(T->Left) ReleaseTree(T->Left);
if(T->Right) ReleaseTree(T->Right);
free(T);
}
void ReleaseFlag(Tree T){
if(T->Left) ReleaseFlag(T->Left);
if(T->Right) ReleaseFlag(T->Right);
T->flag=0;
}
// build tree according to the fisrt line
Tree NewNode(int Data){
Tree P;
P=(Tree)malloc(sizeof (struct TreeNode));
P->Left=NULL;
P->Right=NULL;
P->Data=Data;
P->flag=0;
return P;
}
Tree BuildTree(int N){
int i,Data;
Tree T;
scanf("%d",&Data);
T=NewNode(Data);
for(i=1;i<N;i++){
scanf("%d",&Data);
InsertTree(T,Data);
}
return T;
}
Tree InsertTree(Tree T,int Data){
if(!T) T=NewNode(Data);
else{
if(T->Data>Data) T->Left=InsertTree(T->Left,Data);
if(T->Data<Data) T->Right=InsertTree(T->Right,Data);
}
return T;
}
//if the number is in the right place return 1 if not return 0
int Check(Tree T,int Data){
if(T->flag){
if(Data<T->Data) return Check(T->Left,Data);
else if(Data>T->Data) return Check(T->Right,Data);
else return 0;
}
else{
if(Data==T->Data) {
T->flag=1;
return 1;
}
else return 0;
}
}
int Judge(Tree T,int N){
int Data,i,flag=0;//flag=0 present the data line is right mow ; flag=1 present that we already confirm that the data line is wrong
int a;
scanf("%d",&Data);
if(Data!=T->Data) flag=1;
else T->flag=1;
for(i=1;i<N;i++){
scanf("%d",&Data);
a=Check(T,Data);
if(a!=1) flag=1;
}
if(flag) return 0;
else return 1;
}
int main()
{
int N,L,i;
Tree T;
scanf("%d",&N);
while(N){
scanf("%d",&L);
T=BuildTree(N);
for(i=0;i<L;i++){
if(Judge(T,N))
printf("Yes\n");
else
printf("No\n");
ReleaseFlag(T);
}
ReleaseTree(T);
scanf("%d",&N);
}
return 0;
}