数据结构(六)查找---平衡二叉树(ASL)

前提

我们之前的二叉排序树的插入(构建)是按照我们输入的数据来进行的,若是我们的数据分布不同,那么就会构造不同的二叉树
{ 62, 88, 58, 47, 35, 73, 51, 99, 37, 93 }

 

{ 35, 37, 47, 51, 58, 62, 73, 88, 93, 99 }

我们发现若是数组元素分布大小按顺序,那么我们极有可能得到一颗极不平衡的二叉树,而二叉树深度越大,查找的次数越多,其查找时间复杂度可以高达O(n),那么如何构造一颗平衡的二叉树?

 

平衡二叉树

一:定义

平衡:

左右均匀

平衡因子:

将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor) BF=hl-hr

平衡二叉树(AVL树):

是一种二叉排序树
空树或任一结点左右子树高度差的绝对值不超过1,即|BF|<=1

最小不平衡子树

距离插入结点最近的,且平衡因子绝对值大于1的结点为根 的子树,我们称为最小不平衡子树

 

二:平衡二叉树实现原理

基本思想

在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保存二叉排序树的前提下,调整最小不平衡子树中各个结点之间的链接更新进行相应的旋转,使之成为新的平衡子树

二叉排序树构建过程

{
   3,2,1,4,5,6,10,9,8,7}

我们若是按照二叉排序树进行构建 图一

虽然会符合二叉排序树的定义,但是高度达到8的二叉树,查找不好,效率不高,我们应该尽可能是二叉排序树保持平衡,比如图二

开始构建平衡二叉树AVL

1.选取第一个数据元素3,按照二叉排序树方法正常构建数据,树的平衡因子为0,符合平衡

2.选取第二个数据元素2,按照二叉排序树方法正常构建数据,树的平衡因子为1,符合平衡

3.选取第三个数据元素1,按照二叉排序树方法构建数据位置,树的根节点平衡因子为2,不符合平衡要求,我们找到最小不平衡子树,进行旋转

注意:平衡因子为正数,则右转,为负数,则左转

4.选取第四个数据元素4,按照二叉排序树方法正常构建数据,树的平衡因子没改变,符合平衡

5.选取第五个数据元素5,按照二叉排序树方法正常构建数据,结点3的BF变为-2,说明要进行旋转,我们找到最小不平衡子树,进行旋转

负数,左旋

6.选取第六个数据元素6,按照二叉排序树方法正常构建数据,发现结点2的BF变为-2,说明要进行旋转,而且是左旋

注意:此时本来结点3是结点4的左孩子,由于旋转后,需要满足二叉排序树图像,因此我们将他变为结点2的右孩子

7.选取第七个数据元素7,按照二叉排序树方法正常构建数据,发现结点5的BF变为-2,所以需要对这个最小不平衡子树进行左旋

8.选取第八个数据元素10,按照二叉排序树方法正常构建数据,树的平衡因子没改变,符合平衡

9.选取第八个数据元素9,按照二叉排序树方法正常构建数据,发现结点7的BF值为-2,我们需要进行旋转

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值