同构判定算法
想到这个,不禁让我想起了化学有机物结构式(同分异构体判定),或许可以帮助一下化学系的同学,准确的说,有机物的结构式是一颗乱树,不好处理,更夸张的是有些有机物是立体的,如何判定位置也是个问题,或许可以放到三维坐标系里面解决,不过值得思考,嘿嘿嘿,后续ing。。。
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。
步骤:
1.建立两颗二叉树
2.判断这两颗树是否同构
核心:同构算法
如果两个二叉树为空,则是同构
其中一个是空树,一个不是空树,则非同构
树根的值不一样,非同构
左孩子为空,则判断右孩子是否是同构
左孩子非空,且左孩子相同
则判断两个树的左子树与左子树是否同构,右子树与右子树是否同构,
否则判断T1左子树和T2右子树是否同构,T1右子树和T2左子树是否同构
至于如何判定根节点
可以遍历所有结点,排除有指向的节点,那么没有指向的就是root了。
理清楚这个,代码就好写多了
核心代码
int Isomorphic ( Tree R1, Tree R2 ) {
//如果两个二叉树为空,则是同构
if ( (R1==Null )&& (R2==Null) )
return 1;
//其中一个是空树,一个不是空树,则非同构
if ( ((R1==Null)&&(R2!=Null)) || ((R1!=Null)&&(R2==Null)) )
return 0;
//树根的值不一样,非同构
if ( T1[R1].Element != T2[R2].Element )
return 0;
//左孩子为空,则判断右孩子是否是同构
if( ( T1[R1].Left == Null )&&( T2[R2].Left == Null ) )
return Isomorphic( T1[R1].Right, T2[R2].Right );
//左孩子非空,且左孩子相同
//则判断两个树的左子树与左子树是否同构,右子树与右子树是否同构,
//否则判断T1左子树和T2右子树是否同构,T1右子树和T2左子树是否同构
if ( ((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&& ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)) )
return ( Isomorphic( T1[R1].Left, T2[R2].Left ) && Isomorphic( T1[R1].Right, T2[R2].Right ) );
else
return ( Isomorphic( T1[R1].Left, T2[R2].Right) && Isomorphic( T1[R1].Right, T2[R2].Left ) );
}