为什么仅将数据存储在平衡二叉搜索树的叶节点中?

时间:2013-03-01 17:37:27

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

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

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

illustration of a binary search tree

我有两个问题:

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

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

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

5 个答案:

答案 0 :(得分:4)

  

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

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

  

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

当然! AVL树并不是非常复杂,因此它是学习的理想选择。

答案 1 :(得分:2)

通常有其他种类的二叉树在叶子而不是内部节点处有数据,但对于二进制SEARCH树来说却相当罕见。

您可能希望这样做的一个原因是教育 - 以传统方式实现二进制搜索树通常更容易。为什么?几乎完全是因为删除。删除叶子通常很容易,而删除内部节点更难/更乱。如果您的数据仅在叶子上,那么您总是处于简单的情况!

值得思考内部节点上的键来自哪里。它们通常是在叶子上的重复键(带有数据)。稍后,如果删除了叶子上的键,则内部节点上的键可能仍然存在。

答案 2 :(得分:1)

  

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

通常,在内部节点中存储数据没有任何优势。例如,red-black tree是一个平衡树,它将数据存储在内部和叶子节点中。

  

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

在我看来,它是。

答案 3 :(得分:-1)

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

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

答案 4 :(得分:-1)

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

他们使用的树木是红黑色。

在任何情况下,这里都有一篇文章,它将数据存储在红黑树的内部节点上,然后将这些数据节点作为列表链接在一起。

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

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