給定兩顆二叉樹T1和T2,如果T1可以同過若干次左右孩子互換就變成T2,則我們稱為兩個樹是同構(gòu)的。現(xiàn)判斷兩棵樹是否同構(gòu)。
同構(gòu)與不同構(gòu)
【題目】
題意理解
第二棵樹
【靜態(tài)鏈表結(jié)構(gòu)數(shù)組表示二叉樹】
/* 靜態(tài)鏈表二叉樹 */
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1
struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
}T1[MaxTree],T2[MaxTree];
/* 程序框架 */
int main()
{
Tree R1,R2;
R1=BuildTree(T1);
R2=BuildTree(T2);
if(Isomorphic(R1,R2))
printf("Yes\n");
else
printf("No\n");
return 0;
}
Tree BuildTree(struct TreeNode T[])
{
scanf("%d\n",&N);
if(N){
for(i=0;i<N;i++) check[i]=0; //check為標志位
for(i=0;i<N;i++){
scanf("%c %c %c\n",&T[i].Element,&cl,&cr);
if(cl!='-'){
/*check不為空,則說明存在子孩子
則將子孩子處的check置1,即存在被指向
在樹中check為0,即沒有被指向的節(jié)點就是root
*/
T[i].Left=cl-'0';
check[T[i].Left]=1;
}
else
T[i].Left=NULL;
if(cr!='-'){
T[i].Right=cl-'0';
check[T[i].Right]=1;
}
else
T[i].Right=NULL;
}
for(i=0;i<N;i++) //判別check值為0
if(!check[i]) break;
Root=i;
}
return Root;
}
int Isomorphic(Tree R1,Tree R2)
{
if((R1==NULL)&&(R2==NULL))
return 1;
if(((R1==NULL)&&(R2!=NULL))||((R1!=NULL)&&(R2==NULL)))
return 0;
if(T1[R1].Element!=T2[R2].Element)
return 0;
if((T1[R1].Left==NULL)&&(T2[R2].Left==NULL))
return Isomorphic(T1[R1].Right,T1[R1].Right);
if(((T1[R1].Left!=NULL)&&(T2[R2].Left!=NULL))&&
((T1[T1[R1].left].Element)==(T2[T2[R2].Left].Element)) )
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 ) );
}