让有一棵无向树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),但是我无法找到那个...
有什么想法吗?找到一棵树,给定它的叶子上的数据
回答
继续在评论中进行讨论。这是如何检查一个特定的(压缩的)边缘,以查看是否可以将新顶点连接到其中间的某个位置,而无需迭代距离。
好了,你需要找到三个号码:l
(的附着点在问题边缘的左节点的距离),x
(在新的节点从连接点的距离)和r
(对称l
。)
显然,对于在集L
每个节点y
(树的左边部分),其对A
距离必须从它的距离由相同数量的不同而不同n
(让调用它dl
whi ch必须等于l
+ x
)。如果情况并非如此,那么这种特殊边缘就没有解决方案。 R
中的节点分别为dr
和r
+ x
。
如果上述成立,那么你有三个等式:
l + x = dl
r + x = dr
r+l = dist(A,B)
三个方程,三个数字。如果这有一个解决方案,那么你找到了正确的边缘。
在最坏的情况,你需要重复上述的每一个角落,但我认为它可以被优化 - 对L
和R
的距离检查可能排除进一步搜索树的部分之一。也可以以某种方式获得节点的数量,而不构建树。
我会尽力实施它今天/明天,并回来了解这个答案的反馈。谢谢! – amit 2011-04-02 06:31:58
@amit gr:请注意,可能有优化的空间。这只是为了展示一个有用的想法,而不是完整的最优算法。 – 2011-04-02 18:50:08
完美地工作,但有一些评论,如果有人在将来尝试它:dist(A,B)= r + l-1(因为有一个单一顶点被计数两次),每一步我们需要添加min {对于树中已经存在的每两个顶点(A,B),x}。这个问题在O(n^3)中以这种方式解决,我相信可以通过优化来找到min {x}小于O(n^2)[以每个顶点的适当添加顺序]。 – amit 2011-04-04 09:13:22
如果您的二叉树具有L叶,那么无论树的形状如何,它都有L-1个内部顶点。
您可以很容易证明这一点:从只有一个节点(根)节点的树开始。然后取任何叶子,并添加两个后代,将叶子转换为内部顶点并添加到树叶。这将删除一个叶节点(旧节点),并添加一个内部节点和两个叶节点,即网络为+1内部节点和+1叶节点。因为你从一个叶子和0个内部节点开始,你总是|离开| = |内部节点| +1 - 这个过程可以产生任何树形状。所有的树木两个形状与4个叶
下面的例子(除了微不足道的左右对称性):
o o
o L o o
o L L L L L
L L
内部顶点的数量总是3.
它不一定是二叉树。 – amit 2011-04-02 06:31:10
- 1. 如何使用发电机来遍历一棵树的叶子
- 2. 我想找到一棵树是否是另一棵树的子树,并运行到ArrayList比较prolem
- 3. 如何找到树的叶子
- 4. 如何使用F#给定数据制作一棵树
- 5. 如何找到一棵m-tree树的m的上下界?
- 6. 二叉搜索树 - 复制一棵树到另一棵树
- 7. 如何添加一棵树的所有树叶到C#列表中
- 8. 编写计算给定树的树叶数的函数
- 9. 在树叶中放置一个节点4棵树拖放
- 10. 我知道树上有n片树叶,有多少棵可能的树木?
- 11. 如何在所有可能的子树上分割一棵树?
- 12. 寻找一棵树上最少的呼叫次数
- 13. 如何找到最接近另一棵树的树?
- 14. 如何将一棵树分割成两棵子树
- 15. 在python中找到一棵树的最大数量
- 16. 如何构建一棵树然后遍历每一片叶子(每次从根节点到叶)?
- 17. SimpleXML:将一棵树追加到另一棵树
- 18. 从数据库行构建一棵树
- 19. 如果给定节点数,计算2-3棵树的数量
- 20. Cytoscape:找到特定节点的叶子
- 21. TortoiseSVN给我一棵树冲突
- 22. 从父子数据画一棵树或组织结构图
- 23. 一棵树的和弦
- 24. 用nHibernate加载一棵树重新查询叶节点
- 25. 遍历一棵树
- 26. 如何找到一棵树的最低共同祖先?
- 27. 找到一棵树的“最小分支” - 解决仓库问题
- 28. 制作一棵树并整理出它的数字
- 29. 什么数据结构用于查找2棵树的交集
- 30. 查找从树根到叶子的所有路径在方案
实际上,你可以建立这个树。只保留非分支路径压缩(存储一个边+其长度)并根据需要添加内部节点。因此,两个节点2^31相距仅2个节点加上一个标记为2^31的物理边缘。不知道你是否真的需要*,但你可以。 – 2011-04-01 08:50:01
@Rafal:但是当你试图添加另一个顶点时,你需要检查所有的可能性(除非我错过了某些东西),并且你需要迭代这个距离。 – amit 2011-04-01 08:52:35
gr:不一定,您可以像解析距离一样求解方程。 – 2011-04-01 09:36:29