#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
/***/
typedef char Ele;
typedef struct Node{
Ele e;
struct Node *left;
struct Node *right;
}*Tree,*Tnode;
Tree createTree(){
char tmp;
Tree t;
scanf("%c",&tmp);
if(tmp=='#'){
t=NULL;
}else{
t=(Tree)malloc(sizeof(struct Node));
t->e=tmp;
t->left=createTree();
t->right=createTree();
}
return t;
}
/*判断树是否同构by phoneix 1903935168*/
bool isyes(Tree ta,Tree tb){
if(ta==NULL&&tb==NULL)
return 1;
if(ta==NULL&&tb!=NULL||ta!=NULL&&tb==NULL)
return 0;
if(ta->e!=tb->e)
return 0;
if(ta->left==NULL&&tb->left==NULL)//如果执行到这里已经说明ta->e==t->b了,左子树此时同构只需要判断右子树是否同构
return isyes(ta->right,tb->right);
if(ta->left!=NULL&&tb->left!=NULL&&ta->left->e==tb->left->e)
return isyes(ta->left,tb->left)&&isyes(ta->right,tb->right);
//if(ta->left!=NULL&&tb->left!=NULL&&ta->left->e!=tb->left->e) 少了种情况
else
return isyes(ta->left,tb->right)&&isyes(ta->right,tb->left);
}
void print(Tree t){
if(t){
printf("%c",t->e );
print(t->left);
print(t->right);
}
}
int main(){
Tree t=createTree();
printf("第一颗树输入完毕\n");//abc##e##d##
getchar();//读取第一次输入缓存里的回车,抛弃之
Tree t1=createTree();
printf("第二颗树输入完毕\n");//ad##bc##e##
if(isyes(t,t1))
printf("同构" );
else
printf("不同构" );
}
判断二叉树是否同构3.13
最新推荐文章于 2022-07-13 18:12:29 发布