在二叉树中寻找同构性质的算法

时间:2012-04-27 15:08:33

标签: java algorithm data-structures binary-tree

检查两个二叉树的算法本质上是同构的吗? 我的代码 -

boolean isIsomorphic(Root t1 , Root t2){
    if(t1==null || t2==null){
        return false;
    }

    if((t1.value == t2.value) && (isIsomorphic(t1.left,t2.right) && isIsomorphic(t1.right,t2.left))) {
        return true
    }

    return false; 
}

2 个答案:

答案 0 :(得分:3)

wikipedia article for 'isomorphism'表示“如果两个对象是同构的,那么由同构保留的任何属性对于其中一个对象都是正确的,对另一个对象也是如此。”

所以你的问题需要说明你是否关心形状,数据,表现等。

如果您关心二叉树的搜索行为,则算法不正确。见What does it mean for two binary trees to be isomorphic?

检查同构的最简单方法是对两棵树进行有序遍历,检查每一步后的值。

另一方面,如果您关心shape 数据,@ amits修复程序将为您提供。但请注意,您可以将其称为完全匹配。

最后,如果您只关心形状,那么您需要放弃支票t1.value == t2.value

答案 1 :(得分:0)

here:如果可以通过交换s的某些节点的左右子节点将s转换为t,则两个树s和t是准同构的。节点中的值在确定准同构时并不重要,只有形状很重要。

该链接还提供了这个同构的定义的代码。

如果值很重要,方法可以如下:

  1. 使用两个队列
  2. 对每棵树执行逐级遍历
  3. 在两个树中添加完一个级别后,请检查队列大小。如果不同,请报告'NOT ISOMORPHIC'
  4. 否则,对于第一个第一棵树,将该级别中的所有节点出列到一个集合中。
  5. 对于第二个树,将每个节点出列并检查它是否存在于集合中。
  6. 如果设置成员资格测试失败,请报告'NOT ISOMORPHIC'。
  7. 如果我们完成所有级别,请报告ISOMORPHIC。