比较两个树结构


13

我很难用正确的术语来描述这个问题,所以我会尽可能详细地介绍,希望有人知道我要做什么=-)

我正在尝试比较两个节点树,以确定它们在结构上有多相似/不同。在下面的图表中,两个示例均具有相同数量的子代,孙代等。在示例1中,“根”有一个带有两个子代的子代,但在示例2中,“根”则没有。

我大概可以弄清楚如何递归遍历并计算每个级别有多少并进行比较,从而使我了解树木的相似程度,但是只有这样做,它们看起来才是相同的,但是实际上不是。

有人碰巧知道吗?甚至这是什么技术术语?

编辑:此外,这是在C#中,我正在使用列表来存储这些对象及其子对象。

例子1

在此处输入图片说明

例子2

在此处输入图片说明


1
您实际上想实现什么?这听起来有点像XY问题
msell 2013年

我能描述的最好方法是比较用户一次创建一个分子的“分子”结构。示例1将是用户创建的结构,示例2将是预定义结构列表的一部分,以帮助确定用户是否创建了正确的结构。根树同构显然是我正在寻找的=-)
Mungoid

Answers:


11

您正在寻找的是“根树同构”,它是“ 图形同构”的专门版本,除了树和根节点是固定的。

此作业中给出的解释使用两个属性:

  • 级别数相同(根节点与叶节点之间的距离)
  • 每个级别具有相同数量的节点

使用这两个属性,从树叶到根一直向上,并按照字典顺序为每个节点标记子代数。例如,示例1中的根将被标记为(0,0,(0,1))-它具有三个子代,第一个/第二个具有0个子代,第三个/第二个具有2个子代,分别具有0和1个子代。最后,您只需比较根标签以查看树是否相同。

我还没有做过这类主题,所以我只是在几分钟前才读过这篇文章,所以我不能保证它的正确性。希望它能有所帮助。


太棒了,那就是我想要的东西!我得放手一搏。谢谢!
Mungoid

我认为这仅在您具有根节点的情况下有效,但是在这种情况下,可能是这样的:D +1
Roy T.

如果未提供根节点,您仍然可以使用此技术,但是尝试每个根。比较两棵树时,这意味着最多重复n次。
congusbongus

是的,它就像一种魅力。花了一点时间来理解它,但是效果很好=-)
Mungoid

感谢这一点,看起来我也可以使用,我喜欢算法来找到树的中心。非常聪明。
oodavid

4

看看两个图在逻辑上是否相同的问题称为“ 图同构图”,因此您可能希望从那里开始。

请注意,一般的图同构问题在NP中,但是对于这种特殊情况,可能会有捷径,我不确定,因为知道您必须检查它们是否相等是很合乎逻辑的。


是的,这就是我需要的。永远不会弄清楚那叫什么。谢谢=-)
Mungoid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.