扩张数据结构(动态统计树、区间树)

动态统计树(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.设计一些新操作。

猜你喜欢

转载自www.cnblogs.com/KIROsola/p/12274518.html