树的平衡之AVL树——错过文末你会后悔,信我
学习数据结构应该是一个循序渐进的过程:
当我们学习数组时,我们要体会数组的优点:仅仅通过下标就可以访问我们要找的元素(便于查找)。
此时,我们思考:假如我要在第一个元素前插入一个新元素?采用数组需要挪动整个数组,且计算机找一块数组大小的连续空间是否容易呢???
此时,我们不得不学习链表,学习了链表,很容易的,插入与删除变的高效率了。
但此时我们如果想高效的访问元素,怎么办??(我们没有办法再通过下标的方式了,因为没有下标了),我们不得不按照顺序查找,无疑这也是低效率的。
假如,我们希望采用一种结构:提高插入和查找的效率。我们该怎么做?
这个时候,树就诞生了。而树里面,二叉树的结构最为优秀,简洁易实现,更便于我们分析问题。而二叉查找树使得我们可以将二分查找的思想用于树中,大大提高查找效率。
树的结构就是比较复杂的了。只要符合其定义,都可以称之为树。
比如:

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

图2 非平衡二叉查找树
图2 所示树结构节点数和图1所示树的节点数是相同的,但图2 中,你找一个元素,最差需要找7次!!!这真的效率很低。此时你大概从我图的命名方式中也大概感觉到什么叫平衡和非平衡了。怎么样,非平衡树是真的丑吧,又丑又辣鸡——查找效率低。
别忘了,我们学习树的初衷是什么????————插入 和 查找 的高效率。所以,图2的丑树你能接受吗??
显然不能,因此——在树这种结构中,树的平衡性是非常重要的一个概念,甚至是唯一重要的概念!!!
问题是——假设你现在手头有了图2这样一棵丑树,你老板让你把它变成图1那样的。你怎么办?
OK,树平衡算法和 DSW算法走起来嘛。嗯,我们把一棵丑树变成了一棵美树。
OK ,问题又来了,现在新加入了一个节点,树又变成丑树了,即又不平衡了——咋办????还是像原来一样???
不,原来的方法需要我们将整个树的结构打散,重新组装这棵树——我就加入一个,最多几个节点,需要我打散重组????有没有更便捷的方式嘛?
有——AVL树。。。
有关AVL树,最详细的内容见:http://www.sohu.com/a/270452030_478315(内容真的精彩,左右旋讲的非常清楚!!!),错过你会后悔。
树的平衡之AVL树——错过文末你会后悔,信我的更多相关文章
- 006-数据结构-树形结构-二叉树、二叉查找树、平衡二叉查找树-AVL树
一.概述 树其实就是不包含回路的连通无向图.树其实是范畴更广的图的特例. 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 1.1.树的特性: 每个结点有零个或多个子 ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- 面试题:什么叫平衡二叉查找树--AVL树
查找.插入和删除在平均和最坏情况下都是O(log n) 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树 节点的平衡因子是它的左子树的高度减去它的右子树的高度.带有平衡因子 1.0 或 -1 的 ...
- python常用算法(5)——树,二叉树与AVL树
1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- AVL树的旋转实现
AVL树:带有平衡条件的二叉查找树,即一棵AVL树是其每个节点的左子树和右子树的高度最多相差1的二叉查找树.一般通过Single Rotate和Double Rotate来保持AVL树的平衡.AVL树 ...
- AVL树(查找、插入、删除)——C语言
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...
- AVL树(平衡二叉查找树)
首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...
- 二叉搜索树的平衡--AVL树和树的旋转(图解)
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- 二叉搜索树的平衡--AVL树和树的旋转
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
随机推荐
- Unlink——2016 ZCTF note2解析
简介 Unlink是经典的堆漏洞,刚看到这个漏洞不知道如何实现任意代码执行,所以找了一个CTF题,发现还有一些细节的地方没有讲的很清楚,题目在这里.自己也动手写一遍,体验一下 题目描述 首先,我们先分 ...
- Android Material Design控件使用(三)——CardView 卡片布局和SnackBar使用
cardview 预览图 常用属性 属性名 说明 cardBackgroundColor 设置背景颜色 cardCornerRadius 设置圆角大小 cardElevation 设置z轴的阴影 ca ...
- 熟悉常用的HBase操作,编写MapReduce作业
1. 以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据: 学生表(Student) 学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age) 201 ...
- mac下 将python2.7改为python3
1.查看当前电脑python版本 python -V // 显示2.7.x 2.用brew升级python brew update python 3.如果安装成功,去系统目录下回看到两个版本的pyth ...
- 设置抓包工具Fiddler的host
大家都知道在电脑本地上有一个Host文件. Hosts文件主要作用是定义IP地址和主机名的映射关系,是一个映射IP地址和主机名的规定.可以用文本文件打开!当用户在浏览器中输入一个需要登录的网址时,系统 ...
- gitbook 入门教程之导出电子书
gitbook 既可以将源码文件单独输出,也可以仅输出单个文件,常见的导出电子书格式主要有三种(ePub, Mobi, PDF),而这三种格式都依赖于系统本身提供的 ebook-convert 工具. ...
- 挖一挖MongoDB的备份与还原(实现指定时间点还原和增量备份还原)
一 研究背景需求 目前作者所在公司的MongoDB数据库是每天凌晨做一次全库完整备份,但数据库出现故障时,只能保证恢复到全备时间点,比如,00:30 做的完整备份,而出现故障是下午18:00,那么现 ...
- 数据库之redis篇(2)—— redis配置文件,常用命令,性能测试工具
redis配置 如果你是找网上的其他教程来完成以上操作的话,相信你见过有的启动命令是这样的: 启动命令带了这个参数:redis.windows.conf,由于我测试环境是windows平台,所以是这个 ...
- iOS证书配置与管理
证书: 证书: 命名 特点 团队管理 开发证书 iOS Development 不与App ID对应 表示拥有开发应用的资格 一般只需一个,通过导出p12文件,分发给其他电脑安装: 生产证书 iOS ...
- mysql8.0版本修改密码
登录之后使用如下命令: ALTER USER 'root'@'localhost' IDENTIFIED BY "你的新密码"; 还有不知是不是因为mysql版本问题,一开始设置的 ...