博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构12-AVL树
阅读量:6157 次
发布时间:2019-06-21

本文共 589 字,大约阅读时间需要 1 分钟。

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

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

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

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

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

平衡操作

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

右单旋

左单旋

先右旋转,再左旋转

先左旋转,再右旋转

时间复杂度分析

搜索

O(logn)

添加

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

删除

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

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

你可能感兴趣的文章
Spring常用注解
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
must implement java.io.Serializable hessian
查看>>
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>
HDOJ/HDU 2560 Buildings(嗯~水题)
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>