左单旋

二叉搜索树的旋转之左单旋

  • 首先我们来了解一下二叉搜索树的基本概念:
    二叉搜索树又叫二叉排序树,它是空树或具有以下性质的二叉树:
    1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
    2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    3.它的左右子树也分别为二叉搜索树
  • 其次要了解的是AVL树:
    二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。
    因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:“当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。”

    一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树
    1.它的左右子树都是AVL树
    2.左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
    3.如果一棵二叉搜索树是高度平衡的,它就是AVL树。

AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。

  • 接下来说左单旋:
    如果在一棵原本是平衡的AVL树中插入一个新节点,可能造成不平衡,此时必须调整树的结构,使之平衡化。根据节点插入位置的不同,AVL树的旋转分为四种:
    “左单旋、右单旋、左右双旋、右左双旋”

当我们向平衡二叉树中插入一个新的节点,此时去更新双亲节点的平衡因子时,会发现双亲节点的平衡因子不满足AVL树的要求,即左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
这时我们需要以双亲节点为根对二叉树进行旋转处理。

左单旋发生的情况是——新插入的节点在较高右子树右侧
代码实现:

void RotateL(Node* pParent)
{
	Node* pSubR=pParent->right;
	Node* pSubRL=pParent->left;
	pParent->right=pSubRL;
	
	if(pSubRL)
		pSubRL->parent=pParent;
		
	pSubR->left=pParent;
	Node* pPParent=pParent->parent;

	pParent->parent=pSubR;
	pSubR->parent=pPParent;

	if(nullptr==pPParent)
		_pRoot=pSubR;
	else
	{
		if(pParent==pPParent->left)
			pPParent->left=pSubR;
		else
			pPParent->right=pSubR;
	}
	pParent->bf=pSubR->bf=0;	 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值