二叉树同构判定算法

同构判定算法

想到这个,不禁让我想起了化学有机物结构式(同分异构体判定),或许可以帮助一下化学系的同学,准确的说,有机物的结构式是一颗乱树,不好处理,更夸张的是有些有机物是立体的,如何判定位置也是个问题,或许可以放到三维坐标系里面解决,不过值得思考,嘿嘿嘿,后续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 ) );    
    }
posted @ 2019-11-09 23:18  AmosAlbert  阅读(861)  评论(0编辑  收藏  举报