码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-08 17:21:07      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:info   bool   false   col   scan   include   printf   class   ems   

技术图片

 

 技术图片

 

 技术图片

 

 技术图片

 

 解题思路:

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 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分)--二叉树

标签:info   bool   false   col   scan   include   printf   class   ems   

原文地址:https://www.cnblogs.com/snzhong/p/12443443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!