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

Posted snzhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础实验4-2.1 树的同构 (25分)--二叉树相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 解题思路:

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("
%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 T2左子树均不空
        if(T1[T1[root1].Left].Data==T2[T2[root2].Left].Data)//两棵树的左子树的值相等,不用交换左右子树,递归判断
            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;
}

 

以上是关于基础实验4-2.1 树的同构 (25分)--二叉树的主要内容,如果未能解决你的问题,请参考以下文章

SDUT 3340 数据结构实验之二叉树一:树的同构

PTA 树的同构(25 分)

7-1 树的同构 (25 分)

03-树1 树的同构 (25 分)

7-1 树的同构 (25 分)

7-10 树的同构(25 分)