数据结构篇十二:平衡二叉树

平衡二叉树

平衡二叉树就是对二叉查找树的优化升级,它要求每个节点的左右子树的高度相差不大于1

1.平衡二叉树的查找

平衡二叉树和二叉排序树的查找是一摸一样的。

2.平衡二叉树的顺序输出

平衡二叉树的中序遍历和二叉排序树一样,都是可以输出一个有序的数列。

3.平衡二叉树的插入

平衡二叉树在插入数据时,当发生了高度的不平衡时,会采取4种旋转操作:LL,RR,LR,RL(左左,右右,左右,右左)旋转,我们来一一分析这4种旋转方式。

RR调整

针对右孩子的右子树引起的不平衡

在这里插入图片描述

调整策略

  • 右孩子c左上旋转作为根节点
  • 根节点a左下旋转作为c的左子树
  • c的左子树作为a的右子树
    在这里插入图片描述
LL调整

针对左孩子的左子树引起的不平衡

在这里插入图片描述

调整策略

  • 左孩子b右上旋转作为根节点
  • 根节点a右下旋转作为b的右子树
  • b的右子树作为a的左子树

在这里插入图片描述

LR调整

针对左孩子的右子树引起的不平衡

在这里插入图片描述

调整策略

  • 根节点的左孩子进行一次RR调整
  • 根节点进行一次LL调整

在这里插入图片描述

RL调整

针对右孩子的左子树引起的不平衡

在这里插入图片描述

  • 根节点的右孩子进行一次LL调整
  • 根节点进行一次RR调整

在这里插入图片描述

平衡调整的总结

现在我们将平衡二叉树的调整归纳成一种简单且好理解的记忆方式

  • LL失衡,我们称之为LL调整,策略是对产生失衡的节点进行两次右右旋转,第一次是对失衡节点的左孩子进行右上旋转,第二次是对失衡节点进行右下旋转。
  • RR失衡,我们称之为RR调整,策略是对产生失衡的节点进行两次左左旋转,第一次是对失衡节点的右孩子进行左上旋转,第二次是对失衡节点进行左下旋转。
  • LR失衡,我们称之为LR调整,策略是对产生失衡的节点进行左右旋转,第一次是对失衡节点的左孩子进行LL调整,第二次是对失衡节点进行RR调整。
  • RL失衡,我们称之为RL调整,策略是对产生失衡的节点进行右左旋转,第一次是对失衡节点的右孩子进行RR调整,第二次是对失衡节点进行LL调整。

注意点,LL失衡和RR失衡直接两次旋转,而LR失衡和RL失衡,是分别进行两次LL和RR的组合调整。

实战演练

现在我们有一关键字序列16,3,7,11,9,26,18,14,15,我们来逐个插入构建一棵平衡二叉树。

  1. 插入数字16,直接插入

在这里插入图片描述

2.插入数字3,插入后不失衡,所以不调整。
在这里插入图片描述

3.插入数字7,插入后如左图,发现失衡,失衡点是16,此时的失衡是LR失衡,根据总结规律,先对失衡点的左孩子进行RR调整,然后再对失衡点进行一次LL调整。

在这里插入图片描述

4.插入数字11,插入后,不失衡。

在这里插入图片描述

5.插入数字9,插入后如左图,发现失衡,此时失衡节点有两个节点16和节点7,因为代码设计是递归的判断失衡,所以从从下往上的调整,所以对失衡点16调整,此时16的失衡是LL失衡,先对失衡点16右孩子进行一次LL调整,发现竟然平衡了。所以不用继续调整了。

在这里插入图片描述

6.插入数字26,插入后,节点7发生了失衡,失衡是RR失衡。所以进行RR调整。
在这里插入图片描述

7.插入数字18,此时节点16出现了RL失衡,所以进行RL的调整策略。
在这里插入图片描述

8.插入数字14,此时二叉树平衡。

在这里插入图片描述

9.插入数字15,此时节点16发生了LR失衡,进行LR调整。

在这里插入图片描述

好了,上面就是一个完整的插入过程,可能你会注意到一个特殊情况,就是再插入一个节点时,平衡二叉树失衡点会不只一个,这个时候选择哪个进行调整?结合代码的思路分析,因为二叉树是递归创建的,它是由根节点往叶子节点向下递归创建的,所以检测平衡只能是逆向的,由靠近叶子的向根节点逐层调整,当发现平衡时,就不用调整了。

4.平衡二叉树的删除

平衡二叉树的删除操作分为三大部分,第一大部分是先找打这个节点,第二大部分是按照二叉排序树的删除规则进行删除(可看前面二叉排序树),第三大部分是从该删除点一直上溯到根节点逐个的判断是否失衡,根据失衡条件进行调整平衡二叉树。下面是步骤

  • 按照二叉排序树的查找规则,去找待删除的节点,没找到直接退出。
  • 根据二叉排序树总结删除规则的三条,去选择对应的删除步骤进行删除操作。
  • 从删除该节点的位置开始,一直上溯到根节点,判断是否失衡,如果失衡根据对应失衡,进行相应的调整处理。

删除演示

1.删除26,如下图所示,元素26无左右孩子,直接删除,从此处开始,上溯到根判断是否失衡,发现18节点失衡,是LL失衡,进行LL调整,后面到根都平衡,不用调整。

在这里插入图片描述

2.删除15,如下图所示,按照规则,15左右孩子都有,所以可以先向左走一步,再一直向右走,直到此节点无右孩子,来到了14,将14放在待删除的15位置上,如下图中间,此时从该点开始回溯到根进行调整,发现14失衡,和RL失衡,进行RL调整策略。此时发现调整完毕结束。

在这里插入图片描述

3.删除18,如下图所示,18只有一个左孩子16,按照删除规则,将该左孩子直接放在待删除的18位置上。此时整个二叉树上溯到根节点都是平衡的,不用调整,结束。
在这里插入图片描述

删除操作也讲述完毕,好累。大家多看看步骤,根据步骤去画画图就可以很好的理解了。

获取完整代码

我分别用C,C++,JAVA三种主流语言编写了完整代码,有需要的在微信公众号搜索考研稳上岸获取完整代码

数据结构练习(同样适用于考研)

微信小程序搜索计算机刷题
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值