博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉平衡树的平衡调整
阅读量:5068 次
发布时间:2019-06-12

本文共 1191 字,大约阅读时间需要 3 分钟。

一:平衡二叉树的概念

平衡二叉树(Balanced binary tree)又称为AVL树,是一种特殊的二叉排序树,且左右子树的高度之差的绝对值不超过1.

定义:平衡二叉树或为空树,或为如下性质的二叉排序树:

1)左右子树深度之差的绝对值不超过1;

2)左右子树仍然为平衡二叉树.

平衡因子BF=左子树深度-右子树深度.

平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。

 

二、平衡二叉树调整

  若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树,然后再调整这个子树,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,无需调整原有其他所有不平衡子树,整个二叉排序树就又成为一棵平衡二叉树。

  失去平衡的最小子树是指以离插入结点最近,且平衡因子绝对值大于1的结点作为根的子树。假设用A表示失去平衡的最小子树的根结点,则调整该子树的操作可归纳为下列四种情况。

1)LL型平衡旋转法

  由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行一次顺时针旋转操作。即将A的左孩子B向右上旋转代替A作为根结点,A向右下旋转成为B的右子树的根结点。而原来B的右子树则变成A的左子树。

 

2)RR型平衡旋转法

  由于在A的右孩子C 的右子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行一次逆时针旋转操作。即将A的右孩子C向左上旋转代替A作为根结点,A向左下旋转成为C的左子树的根结点。而原来C的左子树则变成A的右子树。

 

3)LR型平衡旋转法

  由于在A的左孩子B的右子数上插入结点F,使A的平衡因子由1增至2而失去平衡。故需进行两次旋转操作(先逆时针,后顺时针)。即先将A结点的左孩子B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。即先使之成为LL型,再按LL型处理。

 

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为LL型,再按LL型处理成平衡型。

4)RL型平衡旋转法

  由于在A的右孩子C的左子树上插入结点F,使A的平衡因子由-1减至-2而失去平衡。故需进行两次旋转操作(先顺时针,后逆时针),即先将A结点的右孩子C的左子树的根结点D向右上旋转提升到C结点的位置,然后再把该D结点向左上旋转提升到A结点的位置。即先使之成为RR型,再按RR型处理。

 

如图中所示,即先将圆圈部分先调整为平衡树,然后将其以根结点接到A的左子树上,此时成为RR型,再按RR型处理成平衡型。

 

方便记忆:LR、RL以<---方向 L为顺时针,R为逆时针旋转

转载于:https://www.cnblogs.com/lezhifang/p/6632355.html

你可能感兴趣的文章
转载--关于hdfs
查看>>
SharePoint 2013 图文开发系列之Visual Studio 创建母版页
查看>>
微软职位内部推荐-Software Engineer II
查看>>
小程序:彩票机选神器 !
查看>>
ping过程详解
查看>>
MVC - 云服务器部署
查看>>
sqoop数据导入到Hdfs 或者hive
查看>>
AWS国际版的Route 53和CloudFront
查看>>
bzoj 2456: mode【瞎搞】
查看>>
bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
查看>>
excel动态去重和动态排序
查看>>
走进异步世界-犯傻也值得分享:ConfigureAwait(false)使用经验分享
查看>>
sql2000执行sql2005导出的数据脚本时出现“提示含有超过64K限度的行”(转)
查看>>
设计模式(20)-----迭代器模式
查看>>
AutoCAD.NET二次开发:创建自定义菜单(AcCui)
查看>>
NHibernate的调试技巧和Log4Net配置
查看>>
foreach和List.Foreach 退出循环相关问题
查看>>
数据转换
查看>>
同源策略
查看>>
WPF : ListBox的几种Template属性
查看>>