mooc 樹的同構

03-樹1 樹的同構 (25分)
給定兩棵樹T1和T2。如果T1可以通過若干次左右孩子互換就變成T2,則我們稱兩棵樹是“同構”的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點A、B、G的左右孩子互換后,就得到另外一棵樹。而圖2就不是同構的。


圖1



圖2

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
#define Tree int 
#define ElementType char
#define Null -1

struct TreeNode{
    ElementType Element;
    Tree Left,Right;
}T1[MaxSize],T2[MaxSize];

//創(chuàng)建樹,返回根
Tree BuildTree(struct TreeNode T[]){
    int n;
    int check[MaxSize];
    for(int i=0;i<MaxSize;i++) check[i]=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        char b,c;
        scanf("%c %c %c",&T[i].Element,&b,&c);
        if(b!='-'){
            T[i].Left=b-'0';
            check[T[i].Left]=1;
        }
        else{
            T[i].Left=Null;
        }
        if(c!='-'){
            T[i].Right=c-'0';
            check[T[i].Right]=1;
        }
        else{
            T[i].Right=Null;
        }
    }
    for(int i=0;i<n;i++){
        if(!check[i]) break;
    }
    return i; 
}

//用遞歸判斷是否同構
int IsSame(Tree r1,Tree r2)
{
    if(r1 == Null && r2 == Null) return 1;
    if(r1 == Null && r2 != Null||r1 != Null && r2 == Null) return 0;
    if(r1 != Null && r2 != Null && T1[r1].Element != T2[r2].Element) return 0;
    if(T1[r1].Left == Null && T2[r2].Left == Null)  return IsSame(T1[r1].Right,T2[r2].Right);
    if(T1[r1].Left != Null && T2[r2].Left != Null && T1[T1[r1].Left].Element == T2[T2[r2].Left].Element)
        return IsSame(T1[r1].Right,T2[r2].Right)&&IsSame(T1[r1].Left,T2[r2].Left);
    else return IsSame(T1[r1].Left,T2[r2].Right) && IsSame(T1[r1].Right,T2[r2].Left);
}

int main()
{
    //freopen("in.txt","r",stdin);
    Tree R1,R2;
    R1=BuildTree(T1);
    R2=BuildTree(T2);
    if(IsSame(R1,R2)) printf("Yes");
    else printf("No");
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容