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

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

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

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

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

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

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

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

比如:

图1  二叉查找平衡树

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

看下面这棵树:

图2  非平衡二叉查找树

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

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

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

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

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

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

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

有——AVL树。。。

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

转载于:https://www.cnblogs.com/shaonianpi/p/10507161.html

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

  1. 树、二叉树、AVL树,B树基础学习

    树.二叉树.AVL树,B树基础学习 一.树的基本概念 树是一种数据结构,它是由n(n>1)个有限节点组成的一个具有层次关系的集合. 树的基本概念 1.双亲:若有一个结点有子树,那么该结点就称为子 ...

  2. 设平衡二叉排序树(AVL树) 的节点个数为n,则其平均检索长度为log2n

    平衡二叉树又称AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树, 且左子树和右子树的深度之差的绝对值不超过1,若将二叉树上节点的平衡因子BF定义为该节点的左子树 ...

  3. 构造avl树_浅谈AVL树,B-树,B+树

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  4. Python数据结构与算法笔记(八):数据结构——树,二叉树和AVL树

    树 class Node:def __init__(self, name, type='dir'):self.name = nameself.type = type #"dir" ...

  5. 平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现

    对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件 ...

  6. 【数据结构】AVL树(高度平衡的二叉搜索树)

    AVL树(高度平衡的二叉搜索树) ①AVL树概念 ②平衡方法 <1>单旋 左单旋 右单旋 <2>双旋 先左后右旋 先右后左旋 ③代码实现 <1>所需头文件 < ...

  7. AVL树-自平衡二叉查找树(Java实现)

    在计算机科学中,AVL树是最先发明的自平衡二叉查找树.AVL树得名于它的发明者 G.M. Adelson-Velsky 和 E.M. Landis,他们在 1962 年的论文 "An alg ...

  8. AVL树(平衡二叉搜索树)详解及C++代码实现

    AVL树简介 AVL树实际上一个引入了平衡因子的二叉搜索树,该平衡因子保证了每个节点的左右子树高度之差的绝对值不超过1,这样就可以降低树的高度,减少平均搜索长度. 一棵AVL树或者是空树,或者是具有以 ...

  9. AVL树(二)之 C++的实现

    AVL树(二)之 C++的实现 概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍 2. AVL树的C++实现 转载请注明出处: ...

最新文章

  1. 阿里转衰!百度没落!字节跳动崛起!未来的互联网是腾讯和字节跳动的世界!这样的言论你相信吗?...
  2. Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
  3. 定价相关的主要用户出口
  4. 学习笔记 Keras:一些基本概念
  5. Qt使用UDp通信、套接字socket的成员函数bind()的作用
  6. Java overview JVM
  7. IntelliJ IDEA 刷题利器 LeetCode 插件
  8. Python学习---Django的基础操作180116
  9. Notepad++ 配合TCC直接编译运行C代码
  10. ubuntu上安装python3.7教程_给ubuntu18安装python3.7的详细教程
  11. 【2019JXCPC省赛:H】Rng(找规律+逆元)
  12. DateUtils 工具类
  13. 主键中的mappdeBy的使用方法
  14. 基于ifix组态软件研究控制按钮权限
  15. petalinux 安装
  16. 量子计算的基础知识和基本原理
  17. Hexo 个人博客搭建完整版笔记
  18. 什么是IT人员外包?
  19. 简述人工智能发展的先决条件
  20. sqlserver日期减一天_第二人立减1000 | 去厦门吃的地道精彩不重样,没有比这更“惠”吃了!...

热门文章

  1. 使用inetaddress测试目标可达性_纯java手写打造方法级白盒测试框架
  2. sf | 创建空间矢量对象及其投影设置
  3. 金融数据分析与挖掘实战练习2.5-2.9
  4. 为什么程序员互相之间不能透露薪水?是怕“凡尔赛”吗?
  5. linux安全基线检查,CentOS Linux 7安全基线检查
  6. 一年级学python_你是如何自学 Python 的?
  7. linux trac svn,Ubuntu安装Trac SVN的方法及命令
  8. php上传png_PHP支持多种格式图片上传(支持jpg、png、gif)
  9. 一点一滴岗位测试答案_心理测试:凭直觉,选你最喜欢的一件睡衣,测你的野心是什么级别...
  10. oracle循环不是a就取b,oracle数据库试题的.doc