是否有一个<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))
的隐喻很棒,但其他语言(例如Java
,c
)也将有所帮助。顺便说一句:
可能的应用:
答案 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。它具有以下属性:
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
不幸的是,我认为没有任何标准库实现,但是如果您要寻找开源的话,您可以找到它。您可能需要自己动手。