扩张红黑树构造出两种数据结构
动态顺序统计:
支持一般动态集合上顺序统计操作的数据结构,通过这种结构我们可以快速的找到一个集合中的第i小的数,或者一个指定元素在集合中的全序中的位置。
修改红黑树使得可以在O(lgn)时间内确定任何的顺序统计量,集合在集合线性序中的位置成为元素的**秩**。在红黑树的节点中添加了一个新的属性x.size,包含了以x为根的(包含x)的子树的内节点数,即这棵子树的大小,并且我们定义哨兵T.nil.size为零。为了消除存在相同关键字使得秩的定义的不确定性,我们定义一个元素的 秩 为在中序遍历树时输出的位置
查找具有给定秩的元素
OS-SELECT(x,i) //查找第i小的关键字
1. r=x.left.size+1 //以x为根的子树中节点x的秩r
2. if i==r
3. return x
4. elseif i<r
5. return OS-SELECT(x.left,i)
6. else return OS-SELECT(x.right,i-r) //在x的右子树中查找第i-r小的
确定一个元素的秩
OS-RANK(T,x) //返回对T中序遍历的对应的线性序列中x的位置
1. r=x.left.size+1
2. y=x
3. while y!=T.root //每次迭代的开始,r是以y为根的子树中x.key的秩
4. if y==y.p.right
5. r=r+y.p.left.size+1
6. y=y.p
7. return r
区间树:扩张红黑树来支持由区间构成的动态集合上的一些操作
INTERVAL-SEARCH(T,i) //查找树中与区间i重合的节点,若节点不存在,则返回哨兵T.nil指针
1. x=T.root
2. while x!=T.nil and i does not overlap x.int
3. if x.left!=T.nil and x.left.max>=i.low
4. x=x.left
5. else x=x.right
6. return x