4-11 Isomorphic (10分)

4-11 Isomorphic (10分)

Two trees, T1 and T2, are isomorphic if T1 can be transformed into T2 by swapping left and right children of (some of the) nodes in T1.
如果T1可以通过交换(某些)结点的左右子结点将其转换为T2,那么T1、T2这两棵树就是同构的
For instance, the two trees in Figure 1 are isomorphic because they are the same if the children of A, B, and G, but not the other nodes, are swapped.
例如,图一中的两棵树是同构的,因为交换A、B、G的子结点而不是其它结点它们是同构的
Give a polynomial time algorithm to decide if two trees are isomorphic.
给出一个多项式时间算法来确定两棵树是否同构在这里插入图片描述

Format of functions:

int Isomorphic( Tree T1, Tree T2 );

where Tree is defined as the following:

typedef struct TreeNode *Tree;
struct TreeNode {
    ElementType Element;
    Tree  Left;
    Tree  Right;
};

The function is supposed to return 1 if T1 and T2 are indeed isomorphic, or 0 if not.

Sample program of judge:

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;

typedef struct TreeNode *Tree;
struct TreeNode {
    ElementType Element;
    Tree  Left;
    Tree  Right;
};

Tree BuildTree(); /* details omitted */

int Isomorphic( Tree T1, Tree T2 );

int main()
{
    Tree T1, T2;
    T1 = BuildTree();
    T2 = BuildTree();
    printf(%d\n”, Isomorphic(T1, T2));
    return 0;
}

/* Your function will be put here */

Sample Output 1 (for the trees shown in Figure 1):

1

Sample Output 2 (for the trees shown in Figure 2):

0

在这里插入图片描述
代码如下:
配合浙大DSMOOC小白专场 — 同构的判断效果更佳

int Isomorphic(Tree T1,Tree T2){
    if(!T1&&!T2)  return 1;  //如果为空树则是同构的
    if((!T1&&T2)||(T1&&!T2))  return 0;  //如果一个为空一个不为空则不是同构的
    if((T1->Element)!=(T2->Element))  return 0;//如果数据不同则不是同构的
    //如果左儿子都为空判断右儿子是否同构:主要看以上三个方面(1)右儿子是否都为空(2)是否一个有右儿子一个没有(3)右儿子数据是否相同
    if(!T1->Left&&!T2->Left)  return Isomorphic(T1->Right,T2->Right);
    if((T1->Left&&T2->Left)&&(T1->Left->Element==T2->Left->Element))  return Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right);  //如果两棵树左儿子都不为空并且数据还是一样的,对左儿子进行递归
    else  return Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left);  //如果两棵树左儿子(一个空一个不空或者都不空)并且数据不一样,那么判断第一棵树的左(右)儿子是否跟第二棵树的右(左)儿子同构
}

简写版

int Isomorphic( Tree T1, Tree T2 ){
	if(!T1&&!T2) return 1;
	if(!T1&&T2||T1&&!T2||T1->Element!=T2->Element) return 0;
	return Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right)||Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值