平衡搜索树中的左单旋&右单旋&双旋

本文要点:

平衡搜索树的左单旋、右单旋、左右双旋、右左双旋


在平衡搜索树中进行插入结点时,有可能会破坏整棵树的平衡。为了保证平衡不被破坏,就要对一些节点进行旋转,从而来降低树的高度,这样也能保证树的平衡。

一、左单旋:


(上图中的▲结点有可能是NULL,也有可能不为空。。。下同)

从图中可以看出,进行左单旋时,只是改变了parent的右指针以及subR的左指针指向。将subR的左子树(subRL)作为parent的右子树,并让parent作为subR的左子树。很明显,这样做就降低了这棵树的高度。

进行旋转时需要注意的两点:

1.改变subRL->_parent指向时,需要判断subRL是否为NULL,如果为空,就不能对其解引用。

2.parent是否为根节点?如果parent为根节点,那么旋转完成后只需将subR赋给根节点即可;但如果parent不为根节点,即parent是某一节点ppNode的子树,就要判断parent在ppNode的左还是右,这样才能确定subR的位置。

void RotateLeft(Node* parent)	//左单旋
	{		
		Node* subR = parent->_right;
		Node* subRL = subR->_left;

		parent->_right = subRL;	//先改变parent的右指针
		if (subRL)	//subRL可能为NULL
		{
			subRL->_parent = parent;
		}

		Node* ppNode = parent->_parent;
		subR->_left = parent;
		parent->_parent = subR;

		if (ppNode == NULL)
		{
			_root = subR;
			subR->_parent = NULL;
		}
		else
		{
			//判断subR应链接在ppNode的左子树还是右子树
			if (ppNode->_left == parent)
				ppNode->_left = subR;
			else
				ppNode->_right = subR;

			subR->_parent = ppNode;
		}
	}

二、右单旋:


同左单旋一样,右单旋转是将subL的右子树结点赋给parent的左指针,并让parent自己作为subL的右子树。

	void RotateRight(Node* parent)	//右单旋
	{
		Node* subL = parent->_left;
		Node* subLR = subL->_right;

		parent->_left = subLR;
		if (subLR)
		{
			subLR->_parent = parent;
		}

		Node* ppNode = parent->_parent;
		subL->_right = parent;
		parent->_parent = subL;

		if (ppNode == NULL)	//说明parent结点为根节点
		{
			_root = subL;
			subL->_parent = NULL;
		}
		else
		{
			//如果parent不为根节点,判断其在上一个结点的右还是左
			if (ppNode->_left == parent)
				ppNode->_left = subL;
			else
				ppNode->_right = subL;

			subL->_parent = ppNode;
		}
	}

三、左右双旋:

了解了单旋之后,双旋就比较简单,只是进行了两步单旋而已


void RotateLR(Node* parent)		//左右双旋
	{
		RotateLeft(parent->_left);
		RotateRight(parent);

	}
四、右左双旋:


	void RotateRL(Node* parent)		//右左双旋
	{
		
		RotateRight(parent->_right);
		RotateLeft(parent);

	}


  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
malloc lab平衡树是一个在C语言中实现的数据结构,其目的是通过动态内存分配函数malloc来构建一个平衡二叉树。 平衡树,是指左子树的高度差最多为1的二叉排序树。为了保持树的平衡,我们需要在插入和删除节点时进行相应的转操作。由于malloc函数的特性是分配一块连续的内存块,我们可以利用这一特性来构建平衡树。 首先,我们需要定义一个节点结构体,其中包含左子节点指针、键值和平衡因子等信息。然后,我们通过malloc函数动态分配一个节点并初始化,将其插入到平衡树中。 在插入节点时,我们需要根据节点的键值和当前根节点的键值比较来确定插入的位置。如果键值小于当前节点的键值,则将其插入到当前节点的左子树中;如果键值大于当前节点的键值,则将其插入到当前节点的树中。然后,我们需要更新插入路径上各个节点的平衡因子,并进行相应的转操作来调整树的平衡性。 在删除节点时,我们也需要进行相应的转操作来保持树的平衡性。首先,我们需要找到要删除的节点,并进行删除操作。然后,我们需要根据删除路径上各个节点的平衡因子来进行转操作。 通过动态内存分配函数malloc,我们可以灵活地构建和调整平衡树。但需要注意的是,使用malloc函数分配的内存需要在使用后进行释放,以避免内存泄漏问题。因此,在删除节点后,我们需要使用free函数释放相应的内存空间。 总而言之,malloc lab平衡树是一种利用动态内存分配函数malloc来构建的平衡二叉树,通过插入和删除节点,并进行相应的转操作来保持树的平衡性。这是一种高效的数据结构,可以在C语言中灵活地使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值