根据树叶上的数据找到一棵树

时间:2011-04-01 08:39:27

标签: algorithm tree graph-theory

让一个无向的树T,让它:T.leaves - 所有的叶子(每个叶子都是d(v) = 1)。我们知道:|T.leaves|distance between u and v for each u,v in T.leaves
换句话说:我们有一个无向树,我们知道它有多少叶子,以及每两片叶子之间的距离。 我们需要找到how many inside vertices (d(v)>1) are in the tree

注意:建造完整的树是不可能的,因为如果我们只有2片叶子但它们之间的距离是2 ^ 30,则需要很长时间......
我试着从最短的距离开始计算它们之间有多少个顶点,然后加上最接近它们的顶点,但为此我需要一些公式f(leaves_counted,next_leaf)但我可以找不到那个... 任何想法?

2 个答案:

答案 0 :(得分:1)

继续评论中的讨论。这是如何检查特定(压缩)边缘以查看是否可以在其中间的某处附加新顶点n,而无需迭代距离。

tree

好的,所以你需要找到三个数字:l(附着点距离相关边缘左边节点的距离),x(新节点距离附加点)和r(与l对称。)

显然,对于集合y(树的左侧部分)中的每个节点L,它与A的距离必须与其距n的距离不同相同的号码(我们称之为dl必须相等l + x)。如果不是这种情况,则没有针对此特定边缘的解决方案。同样适用于R中的节点,分别为drr + x

如果上述情况成立,则您有三个等式:

l + x = dl

r + x = dr

r+l = dist(A,B)

三个方程式,三个数字。如果这有一个解决方案,那么你找到了正确的优势。

在最糟糕的情况下,您需要针对每个边缘迭代上述内容,但我认为可以对其进行优化 - LR上的距离检查可能会排除进一步搜索中树的某个部分。也许有可能以某种方式获得节点的数量甚至不构建树。

答案 1 :(得分:0)

如果您的二叉树有L个叶子,那么无论树的形状如何,它都有L-1个内部顶点。

您可以轻松证明这一点:从只有一个节点(根)节点的树开始。然后取任何叶子,并向其中添加两个后代,将叶子转换为内部顶点并添加到叶子。这将删除一个叶子(旧节点),并添加一个内部节点和两个叶子,即net是+1内部节点和+1叶子。因为你从一个叶子和0个内部节点开始,所以你总是| leaves | = |内部节点| +1 ---此过程可以生成任何树形状。

这里有4片树的所有两种形状的例子(除了琐碎的左​​右对称):

    o        o
   o L      o o
  o L     L L L L
 L L

内部顶点的数量始终为3.