树的平衡之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. ...
随机推荐
- 一统江湖的大前端(6)commander.js + inquirer.js——懒,才是第一生产力
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- js中json的添加和指定位置的删除
0]绑定数据 grid = $("#Grid").datagrid({ fit: true, rownumbers: true, fitColumns: true, height: ...
- C# 定时器-System.Timers.Timer
using Newtonsoft.Json; using Rafy; using Rafy.Domain; using System; using System.Collections.Generic ...
- C++玄学预编译优化
#pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelete-null-pointer ...
- #WEB安全基础 : HTML/CSS | 0x5a标签拓展和class、id属性的使用
a标签不只是能链接到其他网页,也能链接到网页中的元素 class属性让你用CSS对特定的元素进行修饰 这些是一个网页设计者的有力武器 这节课还是一个index.html文件 以下是代码 <h ...
- java 线程方法 ---- join()
class MyThread2 implements Runnable{ @Override public void run() { for (int i = 0; i < 5; i++){ S ...
- PJSUA2开发文档--第十章 媒体质量(MEDIA QUALITY)
10 媒体质量(Media Quality) 10.1 音频质量 如果遇到音频质量问题,可尝试以下步骤: 遵循指南:使用pjsystest测试声音设备. 识别声音问题并使用以下步骤进行故障排除:检查声 ...
- python:过滤字符串中的字母数字特殊符号
今天遇到的字符串处理的问题,记录一下方便使用 str1 = input('请输入一个字符:') #初始化字符.数字.空格.特殊字符的计数 lowercase = 0 uppercase = 0 num ...
- MySql 学习之路-基础
Mysql 自学之路 本文包含基础部分与高级部分 一.基础 数据库操作 Show databases:显示所有的数据库 Show tables: 显示所有的数据库表 Use databasename: ...
- Python基础——1基础
1.基础 输出 print(‘把子肉爱上热干面’,‘哈哈’) # ‘,’输出为空格 输人 name = input(‘提示的内容’) /浮点除法 %.6f //地板除法 整除 % 取余 pyt ...