动态统计树(order-statistic tree)在每个结点附加信息的红黑树
附加属性:x.size以x为根的子树(包括树根)的(内)结点数
查找具有给定秩的元素 OS_select(T->root,i) 秩中序遍历树时输出的位置
OSTREE OS_select(OSTREE x,int i) { int r = x->left->size + 1; if (i == r) return x; else if (i < r) return OS_select(x->left, i); else return OS_select(x->right, i - r); }
确定一个元素的秩
int OS_rank(ROOT T, OSTREE x) { int r = x->left->size + 1; OSTREE y = x; while (y != T->root) { if (y == y->p->right) { r = y->p->left->size + 1 + r; } y = y->p; } return r; }
对子树规模的维护
插入:第一阶段:对根至叶子额路径上遍历的每一个结点x,都增加x.size属性,新增加结点的size=1
第二阶段:更新因旋转而size失效的两个结点
例如右旋
y->size = x->size; x->size = x->left->size + x->right->size + 1;
扩张一种数据结构可以分为4个步骤:
1.选择--种基础数据结构。
2.确定基础数据结构中要维护的附加信息。
3.检验基础数据结构上的基本修改操作能否维护附加信息。
4.设计一些新操作。