凜冬之翼----樹的同構
阿新 • • 發佈:2019-01-03
這是我的第一篇在CSDN上寫的文章,內容是樹的同構,這個看似簡單的程式碼花費了很多的時間,看來要練到刷題大佬的地步還需要很多時間啊。
下面開始總結:
1、int main(){ } 後面的()一定不要忘記了!
2、在呼叫函式的時候一定要申明資料型別 如 int 指標 之類!
3、一定要完全弄懂原理在下手寫程式碼,不然後期debug非常的困難!
下面是程式碼:
#include<stdio.h>
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1
struct TreeNode{
ElementType Element;
Tree Left;
Tree Right;
}T1[MaxTree],T2[MaxTree];
Tree BuildTree(struct TreeNode T[]){
int N,i,Root=-1;
int check[11];
char cl,cr;
scanf("%d",&N);
getchar();
for(i=0;i<N;i++)
check[i]=0; //set all check[]=0
if(!N)
return Null;
if(N){
for(i=0;i<N;i++){
scanf("%c %c %c",&T[i].Element,&cl,&cr);
getchar(); //to absorb the Enter char
if(cl!='-'){
T[i].Left=cl-'0'; // to make the type of char into int
check[T[i].Left]=1;
}
else T[i].Left=Null;
if(cr!='-'){
T[i].Right=cr-'0';
check[T[i].Right]=1;
}
else T[i] .Right=Null;
}
}
for(i=0;i<N;i++)
if(!check[i])
return i;
}
int Isomorphic(Tree R1,Tree R2){
//printf("%c %c",T1[R1].Element,T2[R2].Element);
if(R1==Null&&R2==Null) // root is null
return 1;
//printf("1");
if(R1==Null&&R2!=Null) // one have root another don't
return 0;
//printf("2");
if(R1!=Null&&R2==Null)
return 0;
if(T1[R1].Element!=T2[R2].Element) //the element of root is different
return 0;
//printf("3");
if(T1[R1].Left==Null&&T2[R2].Left==Null) //the left of root is Null
return Isomorphic(T1[R1].Right,T2[R2].Right);
// printf("4");
if(T1[T1[R1].Left].Element==T2[T2[R2].Left].Element) //the left of root is the same
return Isomorphic(T1[R1].Left,T2[R2].Left)&&Isomorphic(T1[R1].Right,T2[R2].Right);
else
return Isomorphic(T1[R1].Left,T2[R2].Right)&&Isomorphic(T1[R1].Right,T2[R2].Left);
}