基础实验4-2.1 树的同构 (25分)--二叉树

 

 

 

 

 

 

 

 解题思路:

1、建二叉树(静态链表)

   不作为任何结点的孩子结点的即为根结点

2、判断是否同构

1)空树,同构

2)两棵树中若只有其中一棵是空树,则不同构

3)两棵树的根结点值不等,不同构

4)若左子树均空,则递归判断右子树

5)若左子树均不空,

     比较左子树的根结点值

     相等:则没有交换左右子树,判断树1左子树和树2左子树、树1右子树和树2右子树

     不等:交换左右子树,判断树1左子树和树2右子树,树1右子树和树2左子树

解题思路:

1、建二叉树(静态链表)

不作为任何结点的孩子结点的即为根结点

2、判断是否同构

1)空树,同构

2)两棵树中若只有其中一棵是空树,则不同构

3)两棵树的根结点值不等,不同构

4)若左子树均空,则递归判断右子树

5)若左子树均不空且左子树的根结点值相等,则表明没有交换左右子树,递归判断树1左子树和树2左子树&&树1右子树和树2右子树

否则, 交换左右子树,递归判断树1左子树和树2右子树&&树1右子树和树2左子树

#include <stdio.h>
#include <string.h>
#define ElemType char
#define Max 10
typedef enum {false,true
             } bool;
typedef struct {
    ElemType Data;
    int Left,Right;
} Tree;
Tree T1[Max],T2[Max];
int BuildTree(Tree T[]) {
    int n;
    scanf("%d",&n);
    int check[n];
    memset(check,0,sizeof(check));
    int i,root=-1;
    char l,r;
    if(n) {
        for(i=0; i<n; i++) {
            scanf("\n%c %c %c",&T[i].Data,&l,&r);
            {
                if(l!='-') {
                    T[i].Left=l-'0';
                    check[l-'0']=1;
                } else
                    T[i].Left=-1;
                if(r!='-') {
                    T[i].Right=r-'0';
                    check[r-'0']=1;
                } else
                    T[i].Right=-1;
            }
        }
    }

    for(i=0; i<n; i++) {
        if(!check[i]) {
            root=i;
            break;
        }

    }
    return root;
}
bool Isomorphic(int root1,int root2) {
    if(root1==-1&&root2==-1)//空树,同构
        return true;
    if((root1==-1&&root2!=-1)||(root1!=-1&&root2==-1))//两棵树只有一棵是空树,不同构
        return false;
    if(T1[root1].Data!=T2[root2].Data)//根结点值不等,不同构
        return false;
    if(T1[root1].Left==-1&&T2[root2].Left==-1) { //T1 T2的左子树均空,递归判断T1 T2的右子树
        return Isomorphic(T1[root1].Right,T2[root2].Right);
    }
    if((T1[root1].Left!=-1&&T2[root2].Left!=-1)&&(T1[T1[root1].Left].Data==T2[T2[root2].Left].Data)) //T1 T2左子树均不空且两棵树的左子树的值相等,不用交换左右子树,递归判断
        return Isomorphic(T1[root1].Left,T2[root2].Left)&&Isomorphic(T1[root1].Right,T2[root2].Right);
    else //否则,交换左右子树,递归判断
        return Isomorphic(T1[root1].Right,T2[root2].Left)&&Isomorphic(T1[root1].Left,T2[root2].Right);
}

int main() {
    int r1=BuildTree(T1);
    int r2=BuildTree(T2);
    if(Isomorphic(r1,r2)) printf("Yes");
    else printf("No");
    return 0;
}

 

posted @ 2020-03-08 17:02  跃鱼  阅读(513)  评论(0编辑  收藏  举报