学习数据结构应该是一个循序渐进的过程:

当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找)。

此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪动整个数组,且计算机找一块数组大小的连续空间是否容易呢???

此时,我们不得不学习链表,学习了链表,很容易的,插入与删除变的高效率了。

但此时我们如果想高效的访问元素,怎么办??(我们没有办法再通过下标的方式了,因为没有下标了),我们不得不按照顺序查找,无疑这也是低效率的。

假如,我们希望采用一种结构:提高插入和查找的效率。我们该怎么做?

这个时候,树就诞生了。而树里面,二叉树的结构最为优秀,简洁易实现,更便于我们分析问题。而二叉查找树使得我们可以将二分查找的思想用于树中,大大提高查找效率。

树的结构就是比较复杂的了。只要符合其定义,都可以称之为树。

比如:

图1  二叉查找平衡树

图1所示结构:最差的情况,我们查找待查元素需要查找四次(此时实际为找不到的情况)。我们遇到一个新名词:平衡树(待会解释)

看下面这棵树:

图2  非平衡二叉查找树

图2 所示树结构节点数和图1所示树的节点数是相同的,但图2 中,你找一个元素,最差需要找7次!!!这真的效率很低。此时你大概从我图的命名方式中也大概感觉到什么叫平衡和非平衡了。怎么样,非平衡树是真的丑吧,又丑又辣鸡——查找效率低。

别忘了,我们学习树的初衷是什么????————插入 和 查找 的高效率。所以,图2的丑树你能接受吗??

显然不能,因此——在树这种结构中,树的平衡性是非常重要的一个概念,甚至是唯一重要的概念!!!

问题是——假设你现在手头有了图2这样一棵丑树,你老板让你把它变成图1那样的。你怎么办?

OK,树平衡算法和 DSW算法走起来嘛。嗯,我们把一棵丑树变成了一棵美树。

OK ,问题又来了,现在新加入了一个节点,树又变成丑树了,即又不平衡了——咋办????还是像原来一样???

不,原来的方法需要我们将整个树的结构打散,重新组装这棵树——我就加入一个,最多几个节点,需要我打散重组????有没有更便捷的方式嘛?

有——AVL树。。。

有关AVL树,最详细的内容见:http://www.sohu.com/a/270452030_478315(内容真的精彩,左右旋讲的非常清楚!!!),错过你会后悔。

树的平衡之AVL树——错过文末你会后悔,信我的更多相关文章

  1. 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树

    一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...

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

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

  3. 面试题:什么叫平衡二叉查找树--AVL树

    查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...

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

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

  5. AVL树的旋转实现

    AVL树:带有平衡条件的二叉查找树,即一棵AVL树是其每个节点的左子树和右子树的高度最多相差1的二叉查找树.一般通过Single Rotate和Double Rotate来保持AVL树的平衡.AVL树 ...

  6. AVL树(查找、插入、删除)——C语言

    AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...

  7. AVL树(平衡二叉查找树)

    首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...

  8. 二叉搜索树的平衡--AVL树和树的旋转(图解)

    二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...

  9. 二叉搜索树的平衡--AVL树和树的旋转

    二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...

随机推荐

  1. SpringBoot系列——Spring-Data-JPA(升级版)

    前言 在上篇博客中:SpringBoot系列——Spring-Data-JPA:https://www.cnblogs.com/huanzi-qch/p/9970545.html,我们实现了单表的基础 ...

  2. 第一个用eclipse打包APK时报错一个错误怎么解决

    这个问题也是我在android开发群里面解决的一个问题. 如果有什么想法或者想法可以在下面进行评论,我们可以一起交流一下! 我们在eclipse中开发完一个程序之后,需要将其打包为APK的安装包,我们 ...

  3. Java对Excel数据处理(利用POI解析Excel)

    前言 研究生复试结束我在学校官网上看到了全校按姓氏排列的拟录取名单,但是官网并没有给出每个人的专业,只有学号,另外还知道本专业的复试名单,所以我想知道对于本专业的拟录取名单.具体做法就是,扫描复试名单 ...

  4. react 插槽(Portals)

    前言: 昨天刚看了插槽,以为可以解决我工作中遇到的问题,非常激动,我今天又仔细想了想,发现并不能解决... 不过还是记录一下插槽吧,加深印象,嗯,就酱. 插槽作用: 插槽即:ReactDOM.crea ...

  5. Sublime Text 快捷键列表

    Sublime Text 快捷键列表 快捷键按类型分列如下: 补充:1.快速的创建一个html页 :ctrl+n创建一个新的文件-->右下角选择文件类型-->输入英文"!&quo ...

  6. 【Dojo 1.x】笔记4 文字动画效果

    这个笔记,仅仅演示dojo/fx模块的slideTo()方法的简单使用. 有关该模块的用法,见API:有关Dojo的动画.效果,见页面 效果  和  动画 1. 页面组织 html部分同笔记3,js部 ...

  7. Android 图片加载框架 Glide4.x

    概述 Glide是一个图片加载框架,使得我们可以轻松的加载和展示图片 Glide4.x新增apply()来进行设置,apply可以调用多次,但是如果两次apply存在冲突的设置,会以最后一次为准 新增 ...

  8. Python ——报错集锦

    https://blog.csdn.net/weixin_42660771/article/details/80990665 错误(1):SyntaxError:'return' outside fu ...

  9. C#-委托delegate

    目录 委托的定义 委托的声明 委托的实例 委托的注意细节 泛型委托(详见<精通C#>--10.4泛型委托) 1.Action<>委托 3.Func<>委托 附录 委 ...

  10. 【PAT】B1014 福尔摩斯的约会

    因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母D,代表星期四: 第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 ...