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

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

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

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

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

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

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

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

比如:

图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. Markdown 语法详尽笔记大全 2019

    目录  0.介绍  1.快捷键  2.基本语法  2.1 分级标题 # 写法1 # 写法2 上下文标题  2.2 字体设置斜体.粗体.删除线 _*~  2.3 分割线 --- 或 ***  2.4 引 ...

  2. Haskell复习笔记(二)

    Haskell中的递归 递归就是定义函数以调用自身的方式,关于递归解决问题的实例有很多,如斐波那契数列,还有汉诺塔问题,递归也正是Haskell中用来解决循环问题的关键. 自定义maxinum函数 m ...

  3. C#工具:ASP.NET MVC生成图片验证码

    1.复制下列代码,拷贝到控制器中. #region 生成验证码图片 // [OutputCache(Location = OutputCacheLocation.None, Duration = 0, ...

  4. 第一册:lesson 103.

    原文:The French text. How was the exam, Richard? Not too bad. I think I passed in English and Mathemat ...

  5. 环境搭建 - Tomcat(Windows)

    Tomcat环境搭建 本文以Windows7下搭建tomcat-8.5.15为示例 下载tomcat压缩包 网址:Tomcat 非C盘根目录新建文件夹:Tomcat D:\tomcat 将tomcat ...

  6. .babelrc配置(webpack)

    babel是一种js语法编译器,在前端开发过程中,由于浏览器的版本和兼容性问题,很多js的新方法和特性的使用都受到了限制.使用babel可以将代码中js代码编译成兼容绝大多数主流浏览器的代码. bab ...

  7. 自定义控制台程序导出Dynamics 365实体信息到Excel中。

    本人微信公众号:微软动态CRM专家罗勇 ,回复281或者20181116可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 有时 ...

  8. Apex 中 PageReference 的使用

    PageReference类的作用 PageReference类位于Apex的System命名空间下.它可以用来在Apex代码中将页面跳转到指定的位置.在开发的时候,我们也可以向其中添加任意的参数. ...

  9. iOS----------使用cocoapods遇到的问题

    -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...

  10. IDEA修改Git账户和密码

    找到c盘中git目录的.gitconfig文件可以直接修改name和邮箱