【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;
		}
	}
发布了33 篇原创文章 · 获赞 13 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/Vicky_Cr/article/details/104399013
今日推荐