最大最小值以及前驱后继操作最坏情况都为O(1)的顺序统计树

本文探讨如何在顺序统计树上通过增加结点指针,确保在最坏情况下动态集合的MINIMUM, MAXIMUM, SUCCESSOR和PREDECESSOR查询操作都能在O(1)时间内完成,同时保持其他操作的渐近性能不受影响。" 129706621,9651900,Android 跨进程通信AIDL与Binder机制实战解析,"['Android开发', '跨进程通信', 'AIDL', 'Binder']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:通过为结点增加指针的方式,试说明如何在扩张的顺序统计树上,支持每一动态集合查询操作MINIMUM,MAXIMUM,SUCCESSOR和PREDECESSOR在最坏时间O(1)内完成。顺序统计树上的其他操作的渐近性能不应受影响。

代码如下:

//本程序在原有的红黑树基础上增加了子树结点个数,前驱后继结点以及最大小结点属性。
#include <iostream>
#include <time.h>
using namespace std;
#define BLACK 0
#define RED 1
#define Nil -1
#define n  20 //更改顺序统计树内的结点数。
#define LEN sizeof(struct OS_Tree)
struct OS_Tree
{
   struct OS_Tree*right,*left;
   struct OS_Tree*parent;
   struct OS_Tree*next,*prev;
   struct OS_Tree* Max,*Min;
   int key,color,size;//size表示子树的结点数。
};
struct OS_Tree*root=NULL,*nil=NULL,*head=NULL,*tail=NULL;
void LEFT_ROTATE(struct OS_Tree*x)
{//左旋转:分三个步骤①②③来叙述旋转代码的。
	struct OS_Tree*y=x->right;//设置y结点。
	if(y->left!=nil)x->Max=y->left->Max;//对附加信息的维护
	else x->Max=x;
	y->Min=x->Min;
	x->right=y->left;//本行代码以及下面的if结构表达的是“y的左孩子成为x的右孩子”。①
	if(y->left!=nil)
	{
       y->left->parent=x;
	}
	y->parent=x->parent;//本行代码以及下面的if-else结构表达的过程是“y成为该子树新的根”。②
	if(x->parent==nil)
	{
       root=y;
	}
	else if(x==x->parent->left)
	{
       x->parent->left=y;
	}
	else x->parent->right=y;
	y->left=x;//本行代码以及下面一行都表达了“x成为y的左孩子”。③
	x->parent=y;  
    y->size = x->size;  //对附加信息的维护
    x->size = x->left->size + x->right->size +1; 
}
void RIGHT_ROTATE(struct OS_Tree*x)
{//右旋转:分三个步骤①②③来叙述旋转代码的。
	struct OS_Tree*y=x->left;//设置y结点。
	if(y->right!=nil) x->Min=y->right->Min;//对附加信息的维护
	else x->Min=x;
	y->Max=x->Max;
	x->left=y->right;//本行代码以及下面的if结构表达的是“y的左孩子成为x的右孩子”。①
	if(y->right!=nil)
	{
		y->right->parent=x;
	}
	y->parent=x->parent;//本行代码以及下面的if-else结构表达的过程是“y成为该子树新的根”。②
	if(x->parent==nil)
	{
		root=y;
	}
	else if(x==x->parent->right)
	{
		x->parent->right=y;
	}
	else x->parent->left=y;
	y->right=x;//本行代码以及下面一行都表达了“x成为y的左孩子”。③
	x->parent=y;
	y->size = x->size;  //对附加信息的维护
    x->size = x->left->size + x->right->size +1; 
}
void RB_INSERT_FIXUP(struct OS_Tree*z)
{
   while (z->parent->color==RED)
   {
	   if (z->parent==z->parent->parent->left)
	   {
		   struct OS_Tree*y=z->parent->parent->right;//叔结点
		   if (y->color==RED)//情况一:叔结点为红色
		   {//给p1,y,p2着色以保持性质5。并且解决了z的父结点和z都是红色结点问题
			   z->parent->color=BLACK;
			   y->color=BLACK;
			   z->parent->parent->color=RED;
			   z=z->parent->parent;//把z的祖父结点当成新结点z进入下一次循环
		   } 
		   else 
		   {
			   if (z==z->parent
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值