AVL树即平衡二叉树,每个结点有一个平衡因子,即左子树高度减去右子树高。每插入一个结点时,从根部开始按二叉排序树的方法,与节点不断比较,按大小向左右子树插入。在与最后的节点比较后插入时,若有兄弟节点,说明树的高度没有变,此时依然平衡;若没有,则小范围内树高改变了,需回溯,依次更改祖先的平衡因子,若遇到有平衡因子失衡,则,调整,使其与插入之前高度一致,以保证平衡,若未失衡,且平衡因子不变,说明该子树高度未变,停止回溯。

  简而言之就是插入后从底开始看有没有影响树高,小树高可能影响大树高,若无波澜则不变,若有波澜则看是否失衡,失衡调整结束,仅仅只是波澜则继续向上看波澜,平衡因子的值发生变化说明有波澜。

  对于删除,按照二叉排序树的删除方式调整,分为两种三种情况,没有子树和只有一个子树,有两个子树。由平衡二叉树的性质容易知道:没有子树即叶子节点,只有一个子树即叶子节点的父节点,两个子树即其它祖先节点。只有一个子树的情况用子节点替代后删除子节点,两个子树用右子树的最左端的节点替代后删除(即中序遍历的首值、最大值),之后该值用右子树替代,等于两个晋升替代,由于最大值只有右子树,所以其右子树只能为叶子或为空,为空时最大值即为叶子,不为空则为叶子的父节点。三种方法都可以将删除的节点替代为叶子节点。所以与插入相似,归纳为从被删除的该结点开始调整祖先平衡因子,遇到波澜向上看波澜,判断是否要调整,若无波澜结束。

  调整就是两种(四种)情况,相关解释很多。插入时有LL(RR),LR(RL);删除时也可归纳为LL与LR,L代表左高,删除时的两种情况是LL的左边被删,树高减一,该结节因子为0;LR右边被删,树高不变,因子变为2;LR好办,只需调整该结节即可,调整完因子不变,可停止。而LL则需不断回溯,看波澜,最后也可视为一个LL。

  更新:删除节点时可以直接用子树节点替代,若有两个子节点高度相等,则随便选一个节点替代,树高度不变。若有一个高一个低,则拿高的替代,树高减一,回溯。回溯需要保存三个节点指针,以判断是LL还是LR。

关于AVL树的思考的更多相关文章

  1. AVL树插入和删除

    一.AVL树简介 AVL树是一种平衡的二叉查找树. 平衡二叉树(AVL 树)是一棵空树,或者是具有下列性质的二叉排序树:    1它的左子树和右子树都是平衡二叉树,    2且左子树和右子树高度之差的 ...

  2. 树的平衡之AVL树——错过文末你会后悔,信我

    学习数据结构应该是一个循序渐进的过程: 当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找). 此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪 ...

  3. AVL树原理及实现 +B树

    1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好是按照从小到大的顺序或者从大到小的顺序插入的,那么搜索二叉树就对退化成链表,这个时候查找,插入和删除的时间都会 ...

  4. 树-二叉搜索树-AVL树

    树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...

  5. AVL树(二叉平衡树)详解与实现

    AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...

  6. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  7. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  8. AVL树原理及实现(C语言实现以及Java语言实现)

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. AVL定义 AVL树是一种改进版的搜索二叉树.对于一般的搜索二叉树而言,如果数据恰好 ...

  9. AVL树

    AVL树 在二叉查找树(BST)中,频繁的插入操作可能会让树的性能发生退化,因此,需要加入一些平衡操作,使树的高度达到理想的O(logn),这就是AVL树出现的背景.注意,AVL树的起名来源于两个发明 ...

随机推荐

  1. Egret飞行模拟-开发记录02

    1.Egret异步加载资源制作loading界面 使用EUI,EXML组件制作loading界面时,需要皮肤主题资源加载控制.即default.thm.json配置文件. 下一篇专门记录这部分. 2. ...

  2. mybatis使用枚举优化

    文章转自: https://segmentfault.com/a/1190000010755321 问题 在编码过程中,经常会遇到用某个数值来表示某种状态.类型或者阶段的情况,比如有这样一个枚举: p ...

  3. C7.cpp

    Arr[i]==*(ar+i)         &arr[i]==ar+i 编译过程的最终产品是可执行程序------由一组机器语言指令组成 内联函数的优点是速度快,但是会占用很多内存,若是在 ...

  4. python pdfkit html转pdf响应式轮子 django例

    pip install pdfkit 本例用django做的请求,换成对应框架即可 此方法可将html页面转成pdf下载 #!/usr/bin/env python # coding:utf-8 im ...

  5. Python基础之字符串拼接简单介绍

    字符串拼接: %s表示可以传任意类型的值,%d表示只能传数字 test = "my name is %s,age %d" %("xyp",19) print(t ...

  6. this 指向详细解析(箭头函数)

    前言 this 指向问题是入坑前端必须了解知识点,现在迎来了ES6时代,因为箭头函数的出现,所以感觉有必要对 this 问题梳理一下,遂有此文 在非箭头函数下, this 指向调用其所在函数的对象,而 ...

  7. uva-507

    题意:连续序列和最大,直接枚举..... 代码跑了2.4s.QAQ #include <string> #include<iostream> #include<map&g ...

  8. thinkphp3.2.3集成腾讯云短信文档流程

    昨天晚上折腾了一个小时没解决 今天折腾了20分钟就搞定了 看了thinkphp3.2.3的命名空间解释方法  把文件放到这里 /ThinkPHP/Library/Org/ 把新建了一个Sms文件夹 把 ...

  9. !!!常用bootstrap代码

    http://v3.bootcss.com/components/  组件 http://v3.bootcss.com/customize/  bootstrap定制 http://v3.bootcs ...

  10. Openstack EOL 版本离线安装源

    当Openstack EOL,网上的yum源无法安装openstack版本和rdo  ,则无法正常通过yum源直接安装openstack和rdo ,只是直接安装openstack后,也无法通过yum源 ...