让一个无向的树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)但我可以找不到那个...
任何想法?
答案 0 :(得分:1)
继续评论中的讨论。这是如何检查特定(压缩)边缘以查看是否可以在其中间的某处附加新顶点n
,而无需迭代距离。
好的,所以你需要找到三个数字:l
(附着点距离相关边缘左边节点的距离),x
(新节点距离附加点)和r
(与l
对称。)
显然,对于集合y
(树的左侧部分)中的每个节点L
,它与A
的距离必须与其距n
的距离不同相同的号码(我们称之为dl
必须相等l
+ x
)。如果不是这种情况,则没有针对此特定边缘的解决方案。同样适用于R
中的节点,分别为dr
和r
+ x
。
如果上述情况成立,则您有三个等式:
l + x = dl
r + x = dr
r+l = dist(A,B)
三个方程式,三个数字。如果这有一个解决方案,那么你找到了正确的优势。
在最糟糕的情况下,您需要针对每个边缘迭代上述内容,但我认为可以对其进行优化 - L
和R
上的距离检查可能会排除进一步搜索中树的某个部分。也许有可能以某种方式获得节点的数量甚至不构建树。
答案 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.