ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

平衡二叉树

2021-11-20 23:04:49  阅读:152  来源: 互联网

标签:img 因子 外链 二叉树 平衡 防盗链 图片


平衡二叉树

一.插入节点

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)]

标签:img,因子,外链,二叉树,平衡,防盗链,图片
来源: https://blog.csdn.net/CJMINGMING/article/details/121447369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有