我在网上得到的答案很复杂
我在SO也看到了一个问题,但它对我没什么帮助
应该是什么答案?
这也是一棵树吗?
a
/
b
/
c
答案 0 :(得分:2)
请参考以下link,这是一篇关于计算有序树数量的非常好的论文。
答案 1 :(得分:1)
首先,是的,你的例子是任何合理定义下的树,除非你要求树是完整的"哪个是无处提到的。因此,我怀疑这两个页面上的答案(并不奇怪)是错误的。
其次,我不喜欢问题在第二个链接中表达的方式,因为它没有说清楚平等意味着什么。我们只是在寻找拓扑相同的树(相同的结构,即节点的位置),或者我们正在寻找包含一组三个特定节点的树的相等性,就像在第一个链接中一样。所以,我会在第一个链接中坚持这个问题。
我使用了以下有序树的定义。因为这对于这个问题并不重要,所以我将忽略空树的边缘情况,尽管可以编写定义以包括空树作为候选者(如果需要)。有序树由一个根节点和一个可能为空的列表(有序序列)组成,每个子列表也是一个有序树。
这个定义清楚地包含了你的例子。根是A,它有一个孩子B,它有一个孩子C,没有孩子(一个空子列表)。
让我们递归地处理我们放入树中的节点数N.我们让T(N)是可以从一组固定的N(标记)节点构造的不同有序树的数量。
基本情况:N = 1.如果我们只有一个节点,我们只能构造一个树,其中该节点是根。所以T(1)= 1。
第二种情况:N = 2.根节点有两种选择。其余节点必然是根的第一个也是唯一的子节点。所以T(2)= 2。
第三种情况:N = 3.根节点现在有三种选择。一旦我们选择了根节点,我们又有两种情况:
案例A:根节点有两个子节点,每个子节点都是一个有两个元素的有序树。我们可以通过两种方式订购剩下的两个节点。因此,根节点有两个子节点,有3 * 2 = 6个可能的有序树和三个节点。
案例B:根节点有一个子节点,它必须是一个带有两个元素的有序树。有T(2)= 2种不同的方法我们可以从剩下的两个元素构造有序树,所以总共有3 * 2 = 6个可能的有序树,其中三个节点给定根节点只有一个子节点。 / p>
这两个子句涵盖了所有可能性,它们不重叠(它们将可能的有序树分为三个节点),所以我们可以添加它们:T(3)= 6 + 6 = 12。
如果你对更一般的问题感兴趣,它有点棘手,我不知道答案,也不知道答案是否已知。我会采取的方法是这样的:
一般情况:N。有一个根。剩下的N-1个节点必须位于根的子树中。所以你要看N-1的分区数(将N-1分成组的方式)。然后,将需要查看选择进入每个组的项目的方式的数量。然后,您将查看可以根据每个组中的节点数生成的有序树的数量。
无论如何,还有其他方法。但这可能超出了这个问题的范围。
注意:可能出现的一个问题是我是否忘了计算
之类的东西 A A
/ \
B and B
/ \
C C
但是作为有序树木,这些都是一样的。它们已经显示在这里,好像它们是二叉树(每个节点有两个可能是空子树的子节点)。但是对于有序树,我们只关心根是相同的,并且相应的子节点相等。所以在上面的两个案例中,根都是A.在这两种情况下,根都有一个孩子B.在这两种情况下,那个孩子都有一个孩子C.所以树是相同的。