Algorithm 就通用数据结构而言,如何在树数据结构中有效地列出节点下的所有叶子?

Algorithm 就通用数据结构而言,如何在树数据结构中有效地列出节点下的所有叶子?,algorithm,data-structures,tree,linked-list,Algorithm,Data Structures,Tree,Linked List,一段时间以来,我一直在思考和寻找这个问题的答案,即: 如何有效地(具体地说是时间)在树数据结构中列出节点下的所有叶子 我最初认为这可以通过一个链接列表来完成,该列表连接该节点下的所有叶 如果这是可能的,那么我们可以在O(n)的线性时间内遍历子树下的叶子,其中n是该子树下的叶子数 但是,考虑到每个子树需要有不同的链表,这听起来不切实际 所以,如果有人能指出这是可能的还是不可能的,以及为什么,我将不胜感激 让我们在这种情况下考虑一个简单的二叉树。< /P> 这一点也不不切实际 您可以为每个叶设置“下

一段时间以来,我一直在思考和寻找这个问题的答案,即: 如何有效地(具体地说是时间)在树数据结构中列出节点下的所有叶子

我最初认为这可以通过一个链接列表来完成,该列表连接该节点下的所有叶

如果这是可能的,那么我们可以在O(n)的线性时间内遍历子树下的叶子,其中n是该子树下的叶子数

但是,考虑到每个子树需要有不同的链表,这听起来不切实际

所以,如果有人能指出这是可能的还是不可能的,以及为什么,我将不胜感激

让我们在这种情况下考虑一个简单的二叉树。< /P>


这一点也不不切实际

您可以为每个叶设置“下一个”叶,然后在每个节点中只存储指向第一个(或最小)叶和最后一个叶(最大叶)的指针

然后,您可以从每个节点(子树)到达第一个叶,并在叶上迭代


第一个和最后一个leaf可以在插入时以O(logn)复杂度进行更新。

在没有特殊功能的通用树中(每个节点只有有效负载索引和指向子树的指针),您必须遍历整个子树,至少第一次没有其他方法

如果你需要用一种快速的方法再次访问这些叶子节点,你可以设置一个向量/指针数组,给你几乎0(1)次的访问权限,但是你必须管理指针,这样当你插入新节点时,你不再引用旧叶子,而是引用新的叶子

如果您需要对应于多个子树的叶子,那么在正常情况下,简单而快速的解决方案可能是多维数组(在本例中为2D),但如果您的数据集非常大或内存有限,则可能会出现问题(在本例中,您可能希望切换到更适合您的需要的B+树)

允许在叶之间使用指针(下一个,上一个)。假设您的所有数据都存储在叶子级别,那么B+树可能是实现您的要求的最佳方式


如果您询问,只对具有公共根节点(而不是整个树的根)的节点进行叶处理,您只需在该根下找到最左侧的节点,并继续遵循“下一步”链接,直到找到值大于根节点右侧节点的叶节点。

速度和内存大小始终是一个权衡。

科学上有数百种不同的尝试。 但是所有这些额外的指针或列表等都需要额外的内存。
对于一般的解决方案来说,这是不可行的,因为在大多数情况下,速度问题都存在 不是树。
如果你需要一个非常特殊的树,对于一个特定的应用程序,它想要列出树节点下面的所有叶子,比你必须使用一个专门的实现,当你想要的东西比简单地迭代左和右子树,我认为它是合理的快。 还有谁想知道所有子节点的叶子呢?

这是树的内部主题,从外部看,你甚至不应该知道节点下面是什么。(想想平衡树,改变它们的结构)。

嗨,Yochai,我现在编辑了这篇文章,让它更清晰。谢谢