zoukankan      html  css  js  c++  java
  • 二叉树同构判定算法

    同构判定算法

    想到这个,不禁让我想起了化学有机物结构式(同分异构体判定),或许可以帮助一下化学系的同学,准确的说,有机物的结构式是一颗乱树,不好处理,更夸张的是有些有机物是立体的,如何判定位置也是个问题,或许可以放到三维坐标系里面解决,不过值得思考,嘿嘿嘿,后续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 ) );    
        }
    
  • 相关阅读:
    设计模式之单例模式
    设计模式之原型模式
    设计模式之建造者模式
    设计模式之抽象方法模式
    设计模式之简单工厂模式
    java中内存分配
    java引用类型
    Oracle
    Oracle
    Oracle
  • 原文地址:https://www.cnblogs.com/AmosAlbert/p/12832289.html
Copyright © 2011-2022 走看看