AVL树:重平衡

因为BST,在最坏情况下的时间复杂度为O(h),及时在平均情况下也会达到O(\sqrt{n}),这不是很理想的时间复杂度,那么如果想达到理想的时间复杂度,就要对树进行平衡操作,这里就引入了BBST来完成和解决上面的问题,AVL树就是一种BBST.

AVL树的平衡标准,balFacl(v)=height(lc(v))-height(rc(v)),v表示树的节点,balFacl表示平衡因子

                                对于任何节点v,都有|balFacl(v)|<=1,这就是AVL树的定义也是平衡的标准

height(AVL)=O(logn)

对于高度为h的AVL树,至少包含S(h)=fib(h+3)-1个节点(这里设一个节点的高度为0)

无论查找,插入或删除,最坏情况下的时间复杂度为O(logn)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们将这些数字插入到一个空的 AVL 树中。插入的顺序如下: ``` 55, 66, 77, 15, 11, 33, 22, 35, 25, 44, 88, 99 ``` 插入后的 AVL 树如下图所示: ``` 33 / \ 15 66 / \ / \ 11 25 55 77 / / \ 22 35 88 \ 44 \ 99 ``` 现在,我们需要检查每个节点是否平衡。从下到上,我们检查每个节点的左子树和右子树的高度差是否小于等于 1。如果不平衡,我们需要根据不平衡的情况进行旋转。 首先,我们检查节点 22 的父节点 25 和祖父节点 33 是否平衡。它们是平衡的,所以我们不需要进行任何旋转。 接下来,我们检查节点 77 的父节点 66 和祖父节点 33 是否平衡。它们也是平衡的,所以我们不需要进行任何旋转。 然后,我们检查节点 99 的父节点 44 和祖父节点 35 是否平衡。它们是不平衡的,因为节点 44 的左子树高度为 0,右子树高度为 1,高度差为 1,而节点 35 的左子树高度为 1,右子树高度为 0,高度差也为 1。 由于节点 44 是节点 35 的左子节点,我们需要执行左旋转。左旋转后,节点 44 成为节点 35 的父节点,节点 35 成为节点 44 的右子节点。旋转后,AVL 树如下图所示: ``` 33 / \ 15 66 / \ / \ 11 25 55 77 / / \ 22 35 88 \ 44 \ 99 ``` 现在,我们检查节点 66 的父节点 33 和祖父节点 15 是否平衡。它们是不平衡的,因为节点 33 的左子树高度为 1,右子树高度为 3,高度差为 2,而节点 15 的左子树高度为 0,右子树高度为 2,高度差也为 2。 由于节点 66 是节点 33 的右子节点,我们需要执行右旋转。右旋转后,节点 66 成为节点 33 的父节点,节点 33 成为节点 66 的左子节点。旋转后,AVL 树如下图所示: ``` 33 / \ 15 66 / \ / \ 11 25 55 77 / / \ 22 35 88 \ 44 \ 99 ``` 现在,我们检查节点 33 的父节点 15 和祖父节点 33 是否平衡。它们是平衡的,所以我们不需要进行任何旋转。最终,整棵树变成了一个平衡的 AVL 树。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值