您的位置:首页 > 编程语言 > C语言/C++

5-4 是否同一棵二叉搜索树

2016-07-25 10:22 260 查看


#include<stdio.h>
#include<stdlib.h>

typedef struct tree *BinTree;
struct tree{
int ele;
BinTree left,right;
int flag; //flag是访问标志位,1表示已经访问过,0表示还没访问
};
BinTree maketree(int N);
BinTree Insert(BinTree T,int x);
BinTree Newtree(int x);
int check(BinTree T,int y);
int judge(BinTree T,int N);
void reset(BinTree T);
void FreeTree(BinTree T);
main()
{
int N,L,i;
BinTree 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");
reset(T);
}
FreeTree(T);
scanf("%d",&N);
}
}
BinTree maketree(int N)
{
int i,x;
BinTree T;
T=NULL;
for(i=0;i<N;i++)
{
scanf("%d",&x);
T=Insert(T,x);
}
return T;
}
BinTree Insert(BinTree T,int x)
{
if ( !T )
T=Newtree(x);
else
{
if (x>T->ele )
T->right = Insert(T->right,x);
else if(x<T->ele)
T->left = Insert(T->left,x);
}
return T;
}

BinTree Newtree(int x)
{
BinTree T=(BinTree)malloc(sizeof(struct tree));
T->ele=x;
T->left=T->right=NULL;
T->flag=0;
return T;
}
int check(BinTree T,int y)
{
if(T->flag)
{
if(y<T->ele)
return check(T->left,y);
else if(y>T->ele)
return check(T->right,y);
else
return 0;
}
else
{
if(y==T->ele)
{
T->flag=1;
return 1;
}
else
return 0;
}
}
int judge(BinTree T,int N)
{
int y,i,flag=0;
/* flag: 0代表目前还一致,1代表已经不一致*/
for(i=0;i<N;i++)
{
scanf("%d",&y);
if(!flag&&!check(T,y))
flag=1;
}
if(!flag)return 1;
else
return 0;
}
void reset(BinTree T)//将树的标志位置零
{
if(T->left)
reset(T->left);
if(T->right)
reset(T->right);
T->flag=0;
}
void FreeTree(BinTree T)
{
if(T->left)
FreeTree(T->left);
if(T->right)
FreeTree(T->right);
free(T);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 二叉树