每个节点都有平衡的BST保持子树大小吗?

时间:2019-02-28 17:13:03

标签: algorithm data-structures tree binary-search-tree

是否有一个<div class="contain"> <h3 id="red">0</h3> <h3 id="green">0</h3> <h3 id="blue">0</h3> <button onClick="player_one.addResource(4,'green')">Add Green</button> <button onClick="player_one.addResource(3,'red')">Add Red</button> <button onClick="player_one.addResource(7,'blue')">Add Blue</button> </div>结构还可以跟踪每个节点中子树的大小?

balanced BST中,Java是一棵红黑树,但没有在每个节点中提供子树大小。

以前,我确实写过一些BST,可以保持每个节点的子树大小,但是它不平衡。

问题是:

  • 是否可以实现这样的树,同时保持(对于基本操作,TreeMap的效率)
  • 如果是,那么是否有任何第三方库提供这样的提示?
    O(lg(n))的隐喻很棒,但其他语言(例如Javac)也将有所帮助。

顺便说一句:

  • 在每个节点中都应跟踪子树大小。
    这样就可以在不遍历子树的情况下获得大小。

可能的应用:

  • 保持项目等级的跟踪,其值(等级所依赖的)可能会随时更改。

3 个答案:

答案 0 :(得分:1)

例如,AVL树通过完美地平衡,隐含地知道每个子树中有多少个节点,只要它跟踪节点的总数-节点之间的大小差即可。左右子树最多可以是一个元素。每个节点都有一个余额字段,该字段可以是-1、0或1之一,分别表示左侧较大,两者相等或右侧较大。 (或者也许我倒退了,我现在还不确定(小点)。)

无论如何-例如,如果您有一棵具有101个元素的AVL树,您已经知道两个子树每个都有50个元素(因为树是平衡的)-(即101个元素减去子树的根)元素,一分为二)。在下一级别,总共有50个元素,一个子树将有25个元素,其他24个(再加上子树的根中的一个)。余额字段指示哪一个。

此原理一直适用于叶子。

答案 1 :(得分:1)

Weight Balanced Tree(也称为亚当斯树,即Bounded Balance树)在每个节点中保持子树的大小。

这也使从log或n的时间开始或结束查找第N个元素成为可能。

我的implementation in Nim is on github。它具有以下属性:

  • 通用(参数化)键,值映射图
  • 在O(log(N))时间内插入(添加),查找(获取)和删除(del)
  • 键排序的迭代器(顺序和修订)
  • 在O(log(N))时间开始或结束(getNth)的相对位置进行查找
  • 通过输入O(log(N))时间获取位置(排名)
  • 使用树键进行有效的设置操作
  • 映射扩展以使用可选的值合并控件来设置重复项操作

Scheme和Haskell中也有可用的实现。

答案 2 :(得分:1)

这被称为“订单统计树”:https://en.wikipedia.org/wiki/Order_statistic_tree

将大小添加到任何类型的平衡二叉树(红黑,avl,b树等)非常容易,或者您可以使用直接与该大小配合使用的平衡算法,例如权重平衡树(@DougCurrie回答)或(更好)大小平衡的树:https://cs.wmich.edu/gupta/teaching/cs4310/lectureNotes_cs4310/Size%20Balanced%20Tree%20-%20PEGWiki%20sourceMayNotBeFullyAuthentic%20but%20description%20ok.pdf

不幸的是,我认为没有任何标准库实现,但是如果您要寻找开源的话,您可以找到它。您可能需要自己动手。