平衡二叉树

平衡二叉树

一.插入节点

1.如果当前树为空则将新节点作为当前树的根,taller标志为真,插入成功返回

如果当前树不为空且根节点root的数据和新节点数据相等,taller标志为假,则插入失败

如果当前树不为空且新节点数据小于根节点数据,则递归调用1,将新节点插入当前树的左子树当中

(1)如果插入成功,根据taller判断左子树是否长高,如果taller为真,对根节点的平衡因子bf进行判断

(2)如果bf==1,即原来左子树就比右子树高了,而且现在左子树又长高了一层,需要对根节点及其左右子树进行右向平衡调整调整,taller改为false;

如果bf==-1,则原来左子树比右子树矮,只需要修改根节点的平衡因子改为0即可,整棵树并没有长高,taller改为false

如果bf==0,则原本左右子树同样高,现在左子树长高了,则整棵树高度长高了一层,taller改为true,同时平衡因子改为1

(3)右向平衡调整实现:

记当前树的根节点为root,left为左节点

① 如果left的平衡因子为1,则对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKtBEquF-1637420416747)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102162733975.png)]

修改平衡因子,root的平衡因子改为0,left平衡因子改为0,对root进行右旋调整

结果变为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IlFaBOYl-1637420416750)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102162943828.png)]

②如果left的平衡因子为-1,还需要对left的右子树leftright平衡因子进行讨论

a.如果leftright的平衡因子为0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g03yINUW-1637420416751)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102163309033.png)]

修改平衡因子,root的平衡因子改为0,left平衡因子改为0,leftright平衡因子改为0,对root进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D6xnYyiH-1637420416752)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102163519872.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kaf5Oofq-1637420417132)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102163551902.png)]]

b.如果leftright平衡因子为-1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMS9AqM1-1637420416753)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102164227900.png)]

修改平衡因子,root的平衡因子改为-1,left平衡因子改为0,leftright平衡因子改为0,对root进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuS5jvIM-1637420416754)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102163646487.png)]

c.如果leftright平衡因子为1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2UgP7oF-1637420416755)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102164109198.png)]

修改平衡因子,root的平衡因子改为0,left平衡因子改为1,leftright平衡因子改为0,对root进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgBvkIeu-1637420416755)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102163755985.png)]

如果当前树不为空且新节点数据大于根节点数据,则递归调用1,将新节点插入当前树的右子树当中

(1)如果插入成功,根据taller判断右子树是否长高,如果taller为真,对根节点的平衡因子bf进行判断

(2)bf==-1,即原来右子树就比左子树高了,而且现在右子树又长高了一层,需要对根节点及其左右子树进行左向平衡调整调整。

如果bf==1,则原来左子树比右子树高,只需要修改根节点的平衡因子改为0即可,整棵树并没有长高,taller改为false

如果bf==0,则原本左右子树同样高,现在右子树长高了,则整棵树高度长高了一层,taller改为true,同时平衡因子改为-1

(3)左向平衡调整实现:

记当前树的根节点为root,right为左节点

① 如果right的平衡叶子为-1,则对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-635LQgVJ-1637420416756)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102170252890.png)]

修改平衡因子,root的平衡因子改为0,left平衡因子改为0,对root进行左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EFzVkpT-1637420416757)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102170637670.png)]

②如果right的平衡因子为-1,还需要对right的左子树rightleft平衡因子进行讨论

a.如果rightleft的平衡因子为0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f81IiKhy-1637420416758)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171032741.png)]

修改平衡因子,root的平衡因子改为0,right平衡因子改为0,对right进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UeKPBl8m-1637420416759)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171439111.png)]

b.如果rightleft平衡因子为1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bbWXM7Eb-1637420416759)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171000218.png)]

修改平衡因子,root的平衡因子改为0,left平衡因子改为-1,对root进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KiDZvSYd-1637420416760)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171409530.png)]

c.如果rightleft平衡因子为1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XZiD8teC-1637420416761)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171103177.png)]

修改平衡因子,root的平衡因子改为1,left平衡因子改为0,对root进行右旋、然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-003XTayQ-1637420416762)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102171315723.png)]

二.删除节点

1.判断当前树是否为空树,如果是,则返回删除失败

2.如果待删除恰好为当前树的根节点root

(1)判断删除root是否为叶子节点,如果是,则直接删除,变矮标志shorter=true,删除成功,直接返回。

(2)如果root不是叶子节点,根据其平衡因子bf从左子树或者右子树中来找到一个新的节点与它交换数据,这样root会被替换到更底层,更容易直接删除

​ ① 如果bf==1,证明左子树更高,找左子树当中值最大那个节点(假设为p)替换root,也就是root左孩子一直向右走到底的最后一个结点,将p数据与root的数据进行交换,这样我们清楚了待删除结点为于左子树,然后将根节点置为root的左孩子,递归调用本身。

​ ②同理,当bf0或者bf-1,从右子树当中找到比root大的第一个结点,交换,然后修改根节点为root的右孩子,递归调用本身。

3.如果待删除结点数据值小于根节点数据值,将根节点置为root的左孩子,递归调用本身。

4.如果待删除结点数据值大于根节点数据值,将根节点置为root的右孩子,递归调用本身。

5.如果顺利从子树删除节点,如果shorter==true,判断删除节点是位于左子树还是右子树

(1)如果是右子树,记为right,判断根节点的平衡因子bf

​ ①bf==-1,原本右子树比左子树高,现在右子树变矮了,两边平衡,只需要修改根节点平衡因子变为0即可,整体并没有变矮,shorter=true

​ ②原本左右子树等高,现在右子树比左子树矮一层,修改平衡因子变为1,且整体变矮了,shorter=true

​ ③bf==1,左子树原本就比右子树高,现在右子树变矮了,需要对整棵树进行调整,记左子树的平衡因子为lbf,根据lbf对整棵树进行调整,short=true

​ a.如果lbf==1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dkp21QS1-1637420416762)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102231032585.png)]

​ 修改根节点平衡因子bf=0以及左孩子平衡因子rbf=0,然后右旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7SHFcicw-1637420416763)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102231220978.png)]

​ b.如果lbf==0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y7YFrsPi-1637420416764)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102231335644.png)]

​ 修改根节点平衡因子bf=1以及右孩子平衡因子rbf=-1,然后右旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nX4z6Otr-1637420416764)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102231521111.png)]

​ c.如果rbf==-1,

​ 判断左孩子的右孩子是否为叶子节点,如果是,左孩子的右孩子的平衡因子lrbf=0,根节点 平衡因子bf=0以及左孩子平衡因子lbf=0,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bnwn67Ih-1637420416765)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102234229176.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBDZ1HNZ-1637420416766)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102234335165.png)]

​ 如果不是叶子结点,判断其右孩子的左孩子平衡因子的值lrbf

​ 当lrbf==-1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCPvw8ek-1637420416767)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232031782.png)]

​ 修改根节点平衡因子bf=0以及左孩子平衡因子lbf=1,lrbf=0,然后左旋调整左子树、右旋 调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxn0f7tO-1637420416768)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232250430.png)]

​ 当lrbf==0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MC0Gk6Z-1637420416769)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102231857123.png)]

​ 修改根节点平衡因子bf=0以及左孩子平衡因子lbf=0,lrbf=0,然后左旋调整左子树、右旋 调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wm3vQWi-1637420416769)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232319408.png)]

​ 当lrbf==1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cQRWj7T-1637420416770)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232003727.png)]

​ 修改根节点平衡因子bf=-1以及左孩子平衡因子lbf=0,lrbf=0,然后右旋调整右子树、左旋 调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00dPPzAm-1637420416771)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232339803.png)]

(2)如果是左子树,记为left,判断根节点的平衡因子bf

​ ①bf==1,原本左子树比右子树高,现在左子树变矮了,两边平衡,只需要修改根节点平衡因子变为0即可,整体变矮,shorter=true

​ ②bf=0,原本左右子树等高,现在左子树比右子树矮一层,修改平衡因子变为-1,且整体变矮了,shorter=true

​ ③bf==-1,右子树原本就比左子树高,现在左子树变矮了,需要对整棵树进行调整,记右子树的平衡因子为rbf,根据rbf对整棵树进行调整,short=true

​ a.如果rbf==-1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTugNPEr-1637420416772)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232838809.png)]

​ 修改根节点平衡因子bf=0以及右孩子平衡因子rbf=0,然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RuG01UwD-1637420416773)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233107732.png)]

​ b.如果rbf==0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tdEGoZVu-1637420416774)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102232817649.png)]

​ 修改根节点平衡因子bf=-1以及右孩子平衡因子rbf=1,然后左旋调整

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcrUuXkO-1637420416774)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233137706.png)]

​ c.如果rbf==1,

​ 判断其左孩子是否为叶子节点,如果是,修改根节点平衡因子bf=0以及右孩子平衡因子 rbf=0,右孩子的左孩子的平衡因子rlbf=0,然后右旋调整右子树、左旋调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZT2RnXas-1637420416775)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102234138418.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teaL9zKu-1637420416776)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233951634.png)]

​ 如果不是判断右孩子的左孩子的平衡因子的值rlbf

​ 当rlbf==-1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xep59loc-1637420416777)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233611014.png)]

​ 修改根节点平衡因子bf=1以及右孩子平衡因子rbf=0,rlbf=0,然后右旋调整右子树、左旋 调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C4bDGKTh-1637420416778)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233915714.png)]

​ 当rlbf==0,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMkpJy7b-1637420416779)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233550932.png)]

​ 修改根节点平衡因子bf=0以及右孩子平衡因子rbf=0,rlbf=0,然后右旋调整右子树、左旋 调整该树

​ 当rlbf==1,对应这种情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wh26XZgM-1637420416779)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233629279.png)]

​ 修改根节点平衡因子bf=0以及右孩子平衡因子rbf=-1,rlbf=0,然后右旋调整右子树、左旋 调整该树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wegqj7Ud-1637420416780)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233856889.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1xVIHXj-1637420416781)(C:\Users\af1\AppData\Roaming\Typora\typora-user-images\image-20211102233830056.png)]

,然后右旋调整右子树、左旋 调整该树

​ 当rlbf==1,对应这种情况:

[外链图片转存中…(img-wh26XZgM-1637420416779)]

​ 修改根节点平衡因子bf=0以及右孩子平衡因子rbf=-1,rlbf=0,然后右旋调整右子树、左旋 调整该树

[外链图片转存中…(img-Wegqj7Ud-1637420416780)]

[外链图片转存中…(img-u1xVIHXj-1637420416781)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值