数据结构12-AVL树

博客介绍了AVL树,它是在二叉搜索树基础上增加平衡功能的树。为避免二叉搜索树退化为链表,需进行平衡操作,通过为节点增添平衡因子判断失衡。还介绍了右单旋、左单旋等平衡操作,以及搜索、添加、删除的时间复杂度,均为O(logn)。

AVL树在原有的二叉搜索基础上增加了平衡功能,比如默认在二叉搜索树中依次添加如下元素:

这种情况下,二叉树的结果其实和链表是一样的,如果要查找9,需要从根节点依次比较到9,时间复杂度和链表相同为O(n),而不是理想状态的O(logn)。为了让二叉搜素树不出现这种情况,就需要将二叉树进行平衡,使二叉树任意节点左右两边子树高度不能出现太大的差别。

AVL就是一种带有平衡功能的二叉搜索树,它具有以下特点:

  • 每个节点的左右子树的高度差不超过1
  • 搜素、添加、删除的时间复杂度是O(logn)

这里实现方案是,为每一个节点增添一个平衡因子:节点左右子树高度的差,当平衡因子的绝对值大于1,即节点失衡,需要进行平衡操作。

平衡操作

当添加一个节点时,可能会导致他的祖先节点失衡,这时只需要一次平衡操作,平衡按照不同的情况分类操作,这里通过一Demo实现一个自定义AVL树,并且将平衡操作过程通过打印的形式完整的展示出来。

右单旋

左单旋

先右旋转,再左旋转

先左旋转,再右旋转

时间复杂度分析

搜索

O(logn)

添加

插入节点需要O(logn)次搜索,需要1次平衡,平局复杂度O(logn)

删除

移除节点需要O(logn)次搜索,最多需要O(logn)次平衡,,平局复杂度O(logn)

转载于:https://juejin.im/post/5d09b377f265da1bac401b6e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值