AVL树

AVL树

AVL树是最早被发明的自平衡二叉查找树

  • 在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树
  • 查找、插入和删除在平均和最坏情况下的时间复杂度都是 O ( l o g n ) O(logn) O(logn)
  • 节点的平衡因子是它左、右子树的高度之差,如果这个差大于等于2就是不平衡的,即在AVL树中任意节点的左右子树的高度之差不大于1
  • 对于不平衡的树,需要对其做旋转操作使其平衡

AVL树算法

AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。

以下图表以四列表示四种情况,每行表示在该种情况下要进行的操作。在左左和右右的情况下,只需要进行一次旋转操作;在左右和右左的情况下,需要进行两次旋转操作

在这里插入图片描述

求平衡因子

递归地去搜索左右子树的平衡因子并加1,如果当前节点是空节点,就返回0

搜索

可以像普通二叉查找树一样的进行,所以耗费O(log n)时间,因为AVL树总是保持平衡的。不需要特殊的准备,树的结构不会由于查找而改变。(这是与伸展树搜索相对立的,它会因为搜索而变更树结构

插入

在将值val插入树根节点root时需要先进行判断

  • root为空,直接将root的val等于val
  • val &lt; \lt <root.val,将val插入root的左子树,同时判断插入后root的左右子树的平衡因子,如果不平衡
    • 如果val &lt; \lt <root.left.val,就需要将root右旋
    • 如果val &gt; \gt >root.left.val,就需要先将root.left左旋然后将root右旋
  • val &gt; \gt >root.val,将val插入root的右子树,同时判断插入后root的左右子树的平衡因子,如果不平衡
    • 如果val &lt; \lt <root.right.val,就需要先将root.right右旋然后将root左旋
    • 如果val &gt; \gt >root.right.val,就需要将root左旋
删除

从AVL树中删除,可以通过把要删除的节点向下旋转成一个叶子节点,接着直接移除这个叶子节点来完成。因为在旋转成叶子节点期间最多有log n个节点被旋转,而每次AVL旋转耗费固定的时间,所以删除处理在整体上耗费O(log n) 时间

参考自:wiki

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值