数据结构12-AVL树

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

猜你喜欢

转载自blog.csdn.net/weixin_33816611/article/details/93182190