热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

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

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

本文要点:

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


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

一、左单旋:


(上图中的▲结点有可能是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);

}



推荐阅读
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 近期遇到电脑网络不稳定和游戏时频繁重启的问题,寻求专业建议。网络环境为ADSL调制解调器通过路由器共享给两台电脑使用,怀疑存在ARP攻击或硬件配置问题。希望获得详细的故障排查和解决方案。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 如何使用苹果恢复大师恢复手机设备中的日历数据
    当您不小心删除了手机中的日历时,可以通过苹果恢复大师轻松恢复这些数据。本文将详细介绍具体的操作步骤和注意事项,帮助您快速找回丢失的日历信息。 ... [详细]
  • 爱奇艺视频下载指南
    随着百度在视频领域的不断扩展,爱奇艺的内容库日益丰富,涵盖了大量新番动画、电影、电视剧和综艺节目。本文将详细介绍如何通过爱奇艺客户端下载视频,帮助用户轻松实现离线观看。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 易飞扬宣布推出新型低成本100G OTU4光模块,以满足DPI市场的需求。新产品包括100G CFP2 LR4 10KM和100G OTU4 QSFP28 LR4光模块,具备低功耗和高性能特点。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • JavaScript实现表格数据的实时筛选功能
    本文介绍如何使用JavaScript实现对表格数据的实时筛选,帮助开发者提高用户体验。通过简单的代码示例,展示如何根据用户输入的关键字动态过滤表格内容。 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
author-avatar
夏乐迎1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有