本实验源于浙江大学《数据结构》。
本实验源于浙江大学《数据结构》。这道题在小白专场也专门叙述过,逻辑是是否清晰的,主要包含以下函数:
- 主函数负责整个流程
- 创建树的结点函数
- 检查是否同一颗搜索树
- 插入树结点的函数
- 创建树根不断输入叶节点的函数
- judge控制check流程函数
- 重置树
- 释放树
Main函数
main函数主要涉及输入–处理–输出的过程
具体的处理肯定是要交给子函数去判断。
题目中输入的第一个是结点的个数,第二个是要判断的次数。
比如 4 2 也就是我有四个结点,接受两次判断。因此4也就是第一个参数也就是树的结点个数,也是for循环不断++的保证,2也就是判断次数也可以用循环来计数。最后输入0为终结也不要忘了哟!中间调用Judge函数进行判断,每判断一次不忘记输出到底是yes或者No。
树的表示
最普通的表示方法。左孩子右孩子+数据,最后来个flag判断是否同一颗二叉树所用到的标记。
创建树函数
利用maketree函数创建为n,将第一个结点设为根节点(NewNode()函数),然后依次为基础开始建造树,每次的结点用插入函数(Insert)
插入函数
按照定义进行插入,如果大于怎么样,如果小于怎么样,在根的时候不要忘记把结点NewNode一下。
判断函数
判断主要由check和Judge函数.将判断的数据依次输入到judge里,然后先判断根节点。然后由check函数进行递归判断,这里递归判断还是要记得,左子树的定义与右子树的定义。
重置与释放树
先递归然后在根节点释放,假想成后序遍历树。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct TreeNode *Tree;
struct TreeNode{
int v;
Tree Left,Right;
int flag;
};
Tree NewNode(int V){
Tree T=(Tree)malloc(sizeof(struct TreeNode));
T->v=V;
T->Left=T->Right=NULL;
T->flag = 0;
return T;
}
int check(Tree T,int V)
{
if(T->flag){
if(V<T->v)
return check(T->Left,V);
else if(V>T->v)
return check(T->Right,V);
else
return 0;
}else{
if(V==T->v){
T->flag = 1;
return 1;
}else
return 0;
}
}
Tree Insert(Tree T,int V){
if(!T) T = NewNode(V);
else{
if(V>T->v)
T->Right = Insert(T->Right,V);
else
T->Left = Insert(T->Left,V);
}
return T;
}
Tree MakeTree(int N)
{
Tree T;
int i,V;
scanf("%d",&V);
T = NewNode(V);
for(i=1;i<N;i++){
scanf("%d",&V);
T = Insert(T,V);
}
}
int Judge(Tree T,int N)
{
int i,V,flag=0;
scanf("%d",&V);
if(V!=T->v) flag=1;
else T->flag =1;
for(i=1;i<N;i++){
scanf("%d",&V);
if((!flag)&&(!check(T,V)))flag=1;
}
if(flag)return 0;
else return 1;
}
void ResetT(Tree T){
if(T->Left) ResetT(T->Left);
if(T->Right) ResetT(T->Right);
T->flag=0;
}
void FreeTree(Tree T){
if(T->Left) FreeTree(T->Left);
if(T->Right) FreeTree(T->Right);
free(T);
}
int main()
{
//对每组数据
//读入N和L
//根据第一行序列建树T
//依据树T分别判别后面的L个序列是否能与T形成同一搜索树并输出结果
//需要设计的主要函数
//读数据建搜索树T
//判别一序列是否与T构成1样的搜索树
int N,L,i;
Tree T;
scanf("%d",&N);
while(N){
scanf("%d",&L);
T = MakeTree(N);
for(i=0;i<L;i++){
if(Judge(T,N))printf("Yes\n");
else printf("No\n");
ResetT(T);
}
FreeTree(T);
scanf("%d",&N);
}
return 0;
}