当前位置: 代码迷 >> 综合 >> Isomorphic:二叉树同构
  详细解决方案

Isomorphic:二叉树同构

热度:62   发布时间:2023-11-29 20:51:40.0

 如果T1可以通过交换T1中(一些)节点的左右子节点来转换为T2,则T1和T2这两棵树是同构的。例如,图1中的两棵树是同构的,因为如果交换了A、B和G的子节点,而不是其他节点,则它们是相同的。给出一个多项式时间算法来判断两棵树是否同构。

如果T1和T2确实是同构的,函数应该返回1,如果不是,则返回0。

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 */

int Isomorphic( Tree T1, Tree T2 )
{if(!T1&&!T2)//如果两棵树都是空树,两棵树同构return 1;if(!T1&&T2)  //一棵树为空一棵树不为空,不同构return 0;if(T1&&!T2)return 0;if(T1->Element!=T2->Element) //两棵树的数据不同,不同构return 0;if(!T1->Left&&!T2->Left)//两棵树的左子树都为空,判断右子树是不是同构return Isomorphic(T1->Right,T2->Right);//两棵树都有左子树,并且数据都相等,判断两个书是否同构if((T1->Left&&T2->Left)&&(T1->Left->Element==T2->Left->Elemrnt))return Isomorphic(T1->Left,T2->Left)&&Isomorphic(T1->Right,T2->Right);else//如果两棵树左子树(一个空一个不空或者都不空)并且数据不一样,那么判断第一棵树的左(右)儿子是否跟第二棵树的右(左)儿子同构return Isomorphic(T1->Left,T2->Right)&&Isomorphic(T1->Right,T2->Left);}