【问题标题】:Why storing data only in the leaf nodes of a balanced binary-search tree?为什么只将数据存储在平衡二叉搜索树的叶节点中?
【发布时间】:2013-02-16 07:14:45
【问题描述】:

我买了一本关于计算几何的不错的小书。在这里和那里阅读它时,我经常偶然发现这种特殊类型的二叉搜索树的使用。这些树是平衡的,应该只将数据存储在叶子节点中,而内部节点应该只存储值以引导搜索到叶子。

下图显示了这种树的一个示例(其中叶子是矩形,内部节点是圆形)。

我有两个问题:

  1. 内部节点不存储数据有什么好处?

  2. 出于学习的目的,我想实现这样一棵树。因此,我认为使用 AVL 树作为基础可能是个好主意,但这是个好主意吗?

非常欢迎任何有用的资源。

【问题讨论】:

标签: data-structures binary-search-tree computational-geometry


【解决方案1】:

内部节点不存储数据有什么好处?

有些树数据结构在设计上要求内部节点中不存储任何数据,例如Huffman code trees 和B+ trees。在霍夫曼树的情况下,要求没有两个叶子具有相同的前缀(即节点“A”的路径是 101,而节点“B”的路径是 10)。在 B+ 树的情况下,这是因为它针对块搜索进行了优化(这也意味着每个内部节点都有很多子节点,并且树通常只有几层深)。

出于学习的目的,我想实现这样一棵树。因此,我认为使用 AVL 树作为基础可能是个好主意,但这是个好主意吗?

当然! AVL 树并不是非常复杂,因此它是一个很好的学习候选者。

【讨论】:

    【解决方案2】:

    其他类型的二叉树通常在叶子而不是内部节点有数据,但对于二叉搜索树来说相当少见。

    您可能想要这样做的一个原因是具有教育意义 - 以这种方式实现二叉搜索树通常比传统方式更容易。为什么?几乎完全是因为删减。删除叶子通常很容易,而删除内部节点则更难/更麻烦。如果您的数据只在叶子上,那么您总是处于简单的情况!

    值得思考内部节点上的键从何而来。通常它们是位于叶子(带有数据)的键的副本。之后,如果叶子节点的键被删除,内部节点的键可能仍然挂起。

    【讨论】:

    • 迟到的评论——如果我猜对了,你的回答强调了“叶子中的数据”方法的“易用性”,但这本身并不意味着性能提升?
    【解决方案3】:

    内部节点不存储数据有什么好处?

    一般而言,不将数据存储在内部节点中没有任何优势。例如,red-black tree 是一棵平衡树,它将其数据存储到内部节点和叶节点中。

    出于学习的目的,我想实现这样一棵树。因此,我认为使用 AVL 树作为基础可能是个好主意,但这是个好主意吗?

    在我看来,是的。

    【讨论】:

      【解决方案4】:

      仅将数据保存在叶节点(例如 B+ 树)中的一个好处是扫描/读取数据非常简单。叶节点链接在一起。因此,当您位于给定叶节点内数据的“末端”(右侧或左侧)时,要读取下一项,您只需读取指向下一个(或上一个)节点的链接/指针并跳转到下一个叶页.

      对于每个节点都有数据的 B 树,您必须遍历树才能按顺序读取数据。这当然是一个定义明确的过程,但可以说更复杂,通常需要更多的状态信息。

      【讨论】:

      • 迟到的评论——提到迭代目的中叶子的链接向我展示了最重要的方面。
      【解决方案5】:

      我正在阅读同一本书,他们说这可以通过任何一种方式完成,数据存储在外部或内部节点。

      他们使用的树是红黑的。

      无论如何,这里有一篇文章将数据存储在红黑树的内部节点,然后将这些数据节点链接在一起作为一个列表。

      C++ 中具有双向链表的平衡二叉搜索树 作者:Arjan van den Boogaard

      http://archive.gamedev.net/archive/reference/programming/features/TStorage/default.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多