如何使用最大二分匹配解决子树同构?

时间:2015-04-26 04:26:40

标签: algorithm graph binary-tree

我们如何确定给定树T是否包含与另一棵树S同构的子树?

如果其中一个树可以通过一系列翻转从其他树中获得,即通过交换多个节点的左右子节点,则将两个树称为同构。任何级别的任意数量的节点都可以交换子节点。两棵空树是同构的。

我已经在几个地方读过,可以使用二元匹配算法来解决这个问题,但我无法找到任何非支付来源的详细信息。似乎有很多关于这个问题的研究论文,其中大多数都是在付费墙之后,但我目前对此问题的最新研究算法并不感兴趣。我的问题是,双边匹配如何适用于这个问题?

PS:互联网上似乎有一些关于" isomorphic"的含义的混淆。以上是我在大多数地方找到的定义,但有些地方提到"同构"表示无论节点值如何,树都具有相同的形状。如果有人能解决这种混乱,那也很棒。

2 个答案:

答案 0 :(得分:3)

我要谈论有根的子树同构;通过尝试所有的根源,可以在不考虑效率的情况下处理无根据的案件。

基本思想是,如果你有树

    A            B
   /|\          /|\
  / | \        / | \
 /  |  \      /  |  \
a1 ...  am   b1 ...  bn
/\      /\   /\      /\

并且想知道A是否是B的子树,A映射到B,然后是i和{{} {1}},您递归计算以j为根的子树是否是以ai为根的树的子树,以bj映射到ai。 (基本情况是bjA是叶子的时候。)现在,每个子树都可以映射是不够的,因为如果某些B具有特别丰富的结构,然后几个bj可能是子树,但同构的要求不会让他们分享ai。这是最大匹配的来源:我们尝试将所有bjai匹配,以便可以映射子树。

要执行常规根问题,请尝试bj

的所有可能选择

答案 1 :(得分:0)

参见here,有一个子树同构的C#实现。一个蛮力的,我是编码员:) 希望它可以提供帮助。