您的位置:首页 > 其它

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

2017-03-27 22:11 519 查看
题目:是否同一棵二叉搜索树

思路:看的何老师的视频敲的。

先建立正确的树,然后将查找的树在正确的树上查找是否相等

怎么查找?在原树上的所有结点上设置个标记,查找时,每当进去一个结点时,看它是否按正确的轨迹进行走的,正确的话就是走过的结点都是标记过的,如果当前没有被标记,说明就是当前位置,如果不相等,说明就不是原树了!

代码:

#include <cstdio>
#include <cstdlib>
#include <algorithm>
typedef struct TreeNode *Tree;
struct TreeNode{
int v;
Tree Left,Right;//左右子结点
int flag;
};
void ResetT(Tree T){//重置结点的标记0
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);
}
Tree NewNode(int v){//建立首结点
Tree T = (Tree)malloc(sizeof(struct TreeNode));//注意sizeof中不能放指针
T->v = v;
T->Left = T->Right = NULL;
T->flag = 0;
return T;
}
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){//建树
int v;
Tree T = NULL;
for(int i=0;i<N;i++){
scanf("%d",&v);
T = Insert(T,v);
}
return T;
}
int check(Tree T,int v){//寻找当前结点是否在正确位置
if(T->flag){
if(v > T->v) return check(T->Right,v);
if(v < T->v) return check(T->Left,v);
else return 0;//重现重复结点
}else{
if(v == T->v){//位置正确
T->flag = 1;//标记位置
return 1;//
}else return 0;//位置不正确
}
}
int judge(Tree T,int N){//判断是否同一棵树
int v,flag = 1;
for(int i=0;i<N;i++){
scanf("%d",&v);
if(flag && !check(T,v)) flag = 0;
}
if(flag) return 1;
return 0;
}
int main(){
int n,m;
Tree T;
while(scanf("%d",&n) && n){
scanf("%d",&m);
T = MakeTree(n);//建树
ResetT(T);//标记
for(int i=0;i<m;i++){
if(judge(T,n)) printf("Yes\n");
else printf("No\n");
ResetT(T);//标记
}
FreeTree(T);//释放空间
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: