平衡二叉树
作者:互联网
平衡二叉树
一.插入节点
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