一段时间以来,我一直想知道并寻找这个问题的答案: 如何有效地(在时间上具体)列出树数据结构中节点下的所有叶子?
我最初认为可以通过连接该节点下所有叶子的链表来完成。
如果这是可能的,那么我们可以在O(n)的线性时间内在子树下迭代叶子,其中n是该子树下的叶子数。
但是,考虑到每个子树需要具有不同的链表,这听起来是不切实际的。
所以,如果有人可以指出是否可能,或者不是,为什么会这样,我会感激不尽?
在这种情况下,让我们考虑一个简单的二叉树。
此致
答案 0 :(得分:1)
B+ Tree允许叶子之间的指针(next,prev)。假设您的所有数据都存储在叶级别,那么B +树可能是实现您的要求的最佳方式。
如果你问,只有叶子节点有一个共同的根节点(不是整个树的根),你可以找到该根下的最左边的节点并继续跟随“下一个”链接,直到你点击叶节点whos值大于根节点的右节点。
答案 1 :(得分:0)
这根本不是不切实际的。
您可以为每个叶子设置“下一个”叶子,然后在每个节点中只存储指向第一个(或最小)叶子和最后一个叶子(最大叶子)的指针
然后你可以从每个节点(子树)到达第一片叶子并迭代叶子。
第一个和最后一个叶子可以在插入时更新,具有O(logn)复杂度。
答案 2 :(得分:0)
在一个没有特殊功能的通用树中(每个节点只有有效负载索引和指向子树的指针)你必须走完整个子树,至少第一次没有别的办法
如果你需要使用快速方法再次访问那些叶子节点,你可以设置一个指针的向量/数组,它给你几乎O(1)时间访问,但你必须管理指针,这样当你插入新节点,你不再引用旧叶子了,但新的节点
如果您需要与多个子树相对应的叶子,在正常情况下,简单快速的解决方案可能是多维数组(在这种情况下为2D),但如果您拥有非常大的数据集或有限的内存(在这种情况下,您可能会遇到问题)可能想要交换到对你的需求更友好的B + Tree)
答案 3 :(得分:0)
速度和内存大小始终是一种权衡。
科学中有数百种不同的尝试。
但所有这些额外的指针或列表等都需要额外的内存
在大多数情况下,当速度问题时,这对于通用解决方案而言并不实用
不是树
如果你需要一个非常特殊的树,对于想要列出树节点下所有leafes的特定应用程序,比你必须使用专门的实现,当你想要比简单地迭代左右子树更快的东西,我认为合理快速。
还有谁想知道所有子节点的叶子?
这是树的内部主题,从外面你甚至不应该知道节点下面的内容。 (想想平衡的树木,改变它们的结构)。