【C++】 --AVL树的双旋

这个先贴一个之前写的博客,是关于左旋和右旋的AVL树的左旋和右旋这篇博客是对上一节的补充,在增加节点的时候,存在单旋和双旋,本篇文章主要介绍双旋

AVL树的双旋

双旋分为左右双旋和右左双旋

左右单旋:左右双旋先左单旋,再右单旋,即就是先顺时针旋转,后逆时针旋转
在这里插入图片描述

void RotateLR(Node* parent)
	{
		Node* subL = parent->_left;
		Node* subLR = parent->_right;

		//旋转之前保存subLR的平衡因子,旋转完成后,需要根据该平衡因子调整其他节点的平衡因子
		int bf = subLR->_bf;

		//先对30进行左单旋
		RatateL(parent->_left)

		//再对90进行右单旋
		RatateR(parent);

		if (bf == 1)
			subL->_bf = -1;
		else if (bf == -1)
			parent->_bf = 1;
	}

右左双旋:先将节点右单旋,再左单旋转,即就是先逆时针旋转,后顺时针旋转
在这里插入图片描述

void RotateRL(Node* parent)
	{
		Node* subR = parent->_right;
		Node* subRL = parent->_left;

		//旋转之前保存subLR的平衡因子,旋转完成后,需要根据该平衡因子调整其他节点的平衡因子
		int bf = subRL->_bf;
		//以90为中心进行右旋
		RotateR(parent->_right);
		//以30为中心进行左旋
		RotateL(parent);

		if (bf == 1)
		{
			subRL->_bf = 0;
			parent->_bf = -1;
			subR->_bf = 0;
		}
		else if(bf==-1)
		{
			subRL->_bf = 0;
			parent->_bf = 0;
			subR->_bf = 1;
		}
		else if (bf == 0)
		{
			subRL->_bf = 0;
			parent->_bf = 0;
			subR->_bf = 0;
		}
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值