算法导论-13-1-持久动态集合

本文详细解析了红黑树的插入操作过程,包括路径上的结点更新及旋转操作,同时讨论了时间复杂度O(h)的实现细节。

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

题目:





答:

a)需要改变的结点包括“从根结点开始,到要插入到删除的结点”的这条路径上的所有结点。

b)

//持久动态集合上的树的插入操作
tree* Persistent_Tree_Insert(tree *T, int k)
{
	//从根结点开始
	node *p = T->root, *f, *f2;
	//首先根结点是一定要改变的
	T->root = new node(p);
	//改变p结点的孩子,不需要改变的那个,还是指向原来的孩子
	while(p->key != k)
	{
		if(k < p->key)
		{
			//为要改的那个孩子建立一个和它一样的新结点
			f = p->left;
			//若孩子为空,把新结点加入进去
			if(!f)
				f2 = new node(k);
			else
				f2 = new node(f);
			//p指向新孩子
			p->left = f2;
		}
		else
		{
			f = p->right;
			if(!f)
				f2 = new node(k);
			else
				f2 = new node(f);
			p->right = f2;
		}
		//以新结点为父结点,做同样的更新操作
		p = f2;
	}
	//返回树
	return T;
}
c)时间与空间都是O(h)

e)构造一个结点中没有p域的红黑树,类似于算法导论-13.3-6-红黑树基于栈实现RB-INSERT。对于插入删除中的旋转操作,要对从根结点到旋转结点路径上的所以结点进行更新。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值