【问题标题】:find a tree, given the data on its leaves给定叶子上的数据,找到一棵树
【发布时间】:2011-07-27 12:36:57
【问题描述】:

让有一个无向树T,并让有:T.leaves - 所有的叶子(每个 v 使得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^31 的两个节点只是 2 个节点加上一个标记为 2^31 的物理边。不确定您是否真的需要,但可以。
  • @Rafal:但是当您尝试添加另一个顶点时,您需要检查所有可能性(除非我遗漏了什么),并且您需要遍历这个距离。
  • gr:不一定,你可以像距离是浮点数一样求解方程。
  • @Rafal:需要详细说明吗?如果你有一棵树(不像上面讨论的那样简单,但有很多叶子) - 你如何选择在哪里添加新顶点而不进行迭代两片叶子之间的距离?
  • gr:继续回答。

标签: algorithm tree graph-theory


【解决方案1】:

继续 cmets 中的讨论。这是检查特定(压缩)边缘的方法,以查看是否可以将新顶点 n 附加在它中间的某个位置,而无需迭代距离。

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

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

如果以上成立,那么你有三个等式:

l + x = dl

r + x = dr

r+l = dist(A,B)

三个方程,三个数字。如果这有一个解决方案,那么你已经找到了正确的边缘。

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

【讨论】:

  • 我将在今天/明天尝试实施它,然后回来寻求有关此答案的反馈。谢谢!
  • @amit gr:请注意,可能还有优化空间。这只是为了展示一个有用的想法,而不是完整的最优算法。
  • 工作得很好,但如果有人在未来尝试它的话,有几个 cmets:dist(A,B) = r+l-1 (因为有一个顶点被计算两次)并且,每个步骤我们需要为树中已经存在的每两个顶点 (A,B) 添加 min{x}。问题在 O(n^3) 中以这种方式解决,我确信可以进行优化以在小于 O(n^2) 的时间内找到 min{x} [每个顶点的适当添加顺序]。
  • 优化:我们不需要遍历所有可能的元组 (v1,v2),我们可以遍历所有的元组 (root,v),其中 root 是常量,我们对每个顶点都这样做,并且我们得到 O(n^2)
【解决方案2】:

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

你可以很容易地证明这一点:从只有一个节点(根)节点的树开始。然后取任意一个叶子,并添加两个后代,将叶子转换为内部顶点并添加到叶子。这将删除一个叶子(旧节点),并添加一个内部节点和两个叶子,即 net 是 +1 个内部节点和 +1 个叶子。因为你从一个叶子和 0 个内部节点开始,你总是有 |叶子| = |内部节点|+1 --- 任何树形都可以通过这个过程产生。

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

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

内部顶点数始终为 3。

【讨论】:

  • 不一定是二叉树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2018-10-24
相关资源
最近更新 更多