avl

学习数据结构 AVL树

一曲冷凌霜 提交于 2021-01-31 09:06:54
前一篇学习了二叉搜索树,本篇试图学习 AVL 树。可惜的是,Mehta 教授的《数据结构基础》一书中没有给出 删除算法,我还没研究清楚,只好先不写(学)删除部分了。 修改后的 TestTree.java 文件在这里: http://vdisk.weibo.com/s/3fAzF 以下是 insert 部分的代码,注释我已经写得挺清楚的了: public void insert(K key, V value) { this.checkValid(); // 检查现在树的有效性。 internal_insert(key, value); // 实际执行插入。 this.checkValid(); // 插入之后再检查一次。 } /** 内部实现 insert, 返回插入或更新的节点对象。 */ private boolean internal_insert(K key, V value) { if (this.root == null) { // 特定情况,简单处理。 this.root = new TreeNode<K,V>(key, value); return true; } // 第一步:查找 key 的插入位置。 boolean found = false; TreeNode<K, V> a = root, // 离插入点最近的 bf=+-1 的节点,也可能为 root(其

MIT Introduction to Algorithms 学习笔记(七)

此生再无相见时 提交于 2020-05-04 03:29:24
Lecture 6: Balanced Binary Search Trees AVL 树 定义: AVL 树是自平衡二叉查找树, 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 平衡(Balance) : 平衡最坏的情况是每个节点高度差1. AVL 插入: 1. insert as in simple BST 2. work your way up tree, restoring AVL property (and updating heights as you go). 步骤: suppose x is lowest node violating AVL . assume x is right-heavy (left case symmetric) if x's right child is right-heavy or balanced: follow steps in Fig. 5 else: follow steps in Fig. 6 then continue up to x's grandparent, greatgrandparent . . . Example : AVL 排序: 代码 ''' Created on 20151223 @author: Administrator ''' class BST(object): ''' classdocs

Comparison to other structures

♀尐吖头ヾ 提交于 2020-05-04 02:57:56
Both are self-balancing binary search trees, so they are very similar mathematically. The operations to balance the trees are different, but both occur in constant time. The real difference between the two is the limiting height. For a tree of size n : An AVL tree's height is strictly less than: [4] A red-black tree's height is at most 2log 2 ( n + 1) [5] The AVL tree is more rigidly balanced than Red-Black trees , leading to slower insertion and removal but faster retrieval. 来源: oschina 链接: https://my.oschina.net/u/135650/blog/16793

高度平衡的二叉搜索树(AVL树)

六眼飞鱼酱① 提交于 2020-04-08 13:52:16
  AVL树的基本概念   AVL树是一种 高度 平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1。   有人也许要问:为什么要有AVL树呢?它有什么作用呢?   我们先来看看二叉搜索树吧(因为AVL树本质上是一棵二叉搜索树),假设有这么一种极端的情况:二叉搜索树结点的插入顺序为1,2,3,4,5,也就是:                        显而易见,这棵二叉搜索树已经其退化成一个链表了,也就是说,它在查找上的优势已经全无了—— 在这种情况下,查找一个结点的时间复杂度是O(n)!   如果这棵二叉搜索树是AVL树,在插入顺序仍为1,2,3,4,5的情况下,树的形状如下图:                      可以看出,AVL树基本操作的最坏时间复杂度要比普通的二叉搜索树低—— 除去可能的插入操作外(我们将假设懒惰删除),它是O(logn)。   而插入操作隐含着困难的原因在于,插入一个节点可能破坏AVL树的性质(例如,将6插入到上图的AVL树中会破坏根节点2的平衡条件),如果发生这种情况,就要在插入操作结束之前恢复平衡的性质。事实上,这总可以通过对树进行简单的修正来做到,我们称其为 旋转 。   AVL树的旋转   在AVL树中,假设有一个结点的平衡因子为2(最大就是2

平衡树以及AVL树

余生长醉 提交于 2020-04-08 12:30:57
  平衡树是计算机科学中的一类数据结构。 平衡树是计算机科学中的一类改进的二叉查找树。一般的二叉查找树的查询复杂度是跟目标结点到树根的距离(即深度)有关,因此当结点的深度普遍较大时,查询的均摊复杂度会上升,为了更高效的查询,平衡树应运而生了。   在这里,平衡指所有叶子的深度趋于平衡,更广义的是指在树上所有可能查找的均摊复杂度偏低。   几乎所有平衡树的操作都基于树操作,通过旋转操作可以使得树趋于平衡。 对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例。如果可以让树维持矮矮胖胖的好身材, 也就是让h维持在O(lg n)左右, 完成上述工作就很省时间。能够一直维持好身材, 不因新增删除而长歪的搜寻树, 叫做balanced search tree(平衡树)。 旋转Rotate —— 不破坏左小右大特性的小手术 平衡树有很多种, 其中有几类树维持平衡的方法, 都是靠整形小手术。   各种平衡树:AVL树,经典平衡树,所有操作的最坏复杂度是O(lgN)的。         Treap,利用随机堆的期望深度来优化树的深度,达到较优的期望复杂度。         伸展树、红黑树,节点大小平衡树。2-3树、AA树。 AVL树:    AVL树是一棵自平衡的二叉搜索树

平衡二叉树(AVL树)

回眸只為那壹抹淺笑 提交于 2020-03-07 04:51:44
我们先看看二叉排序树可能的问题: 一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在 上面这颗二叉排序树(BST) 存在的问题分析: 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢 解决方案-平衡二叉树(AVL) 平衡二叉树基本介绍 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。 具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 如下图所示,前2个是AVL树,因为其左右2颗子树 高度差不超过一,第三个图不是AVL树,因为其左边树比右边树的高度超过了一 左旋卷,右旋转和双旋转 那么怎么样让一个数列,创建出对应的平衡二叉排序树呢? 左旋转如图: 当根节点的(右子树高度 - 左子树高度 > 1)时我们需要进行左旋转 左旋转步骤: 1. 创建一个新的节点newNode,让其值等于等于当前根节点的值 2. 把新节点的左子树设置成当前节点的左子树即 newNode.left = left 3.

平衡二叉树(AVL树)

前提是你 提交于 2020-02-24 14:22:50
目录 AVL树的提出背景 AVL树的定义 AVL树的定义 AVL树的结点定义 AVL树的简单操作 AVL树的基本操作 查找操作 插入操作 左旋和右旋 插入类型 LL型 LR型 RR型 RL型 小结 代码 建树操作 其他 题型训练 参考文档 AVL树的提出背景 我们知道在 创建二叉查找树 的时候,我们都是使用一个已知的序列,通过从左到右读取序列进行创建。比如对于序列 {1,2,3,4,5} ,我们从左到右读取序列,可以得到如下图的二叉查找树: 显然,这棵二叉查找树是 链式的 。那么,一旦需要对有 1 0 5 10^5 1 0 5 级别个递增元素的序列构建二叉查找树,也将会得到一棵长长的链条式的树,此时对这棵树的结点进行 查找的复杂度 就会达到 O ( n ) O(n) O ( n ) ,这就根本起不到 二叉查找树来进行查询优化的目的 。 综上所述,我们需要对树的结构进行调整,使得树的高度在每次插入元素后 仍然能保持 O ( l o g n ) O(logn) O ( l o g n ) 的级别 ,这样能使查询操作仍然是O(logn)的时间复杂度,于是就产生了平衡二叉树。 AVL树的定义 AVL树的定义 AVL树仍然是一棵二叉查找树 ,只是在二叉查找树的基础上增加了“ 平衡 ”的要求。 平衡 :对AVL树的 任意结点 来说,其左子树与右子树的 高度之差 的绝对值不超过1

平衡二叉树(AVL)

喜夏-厌秋 提交于 2020-02-22 18:53:11
文章目录 AVL 平衡二叉树的概念 AVL树的实现原理 AVL树节点的定义 AVL树的插入 AVL树的旋转 AVL树性能分析 AVL 平衡二叉树的概念 平衡二叉树(Self-Balancing Binary Search Tree 或 Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 二叉排序树虽可以缩短查找的效率,但如果 数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下 。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法: 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度 。 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子BF)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在 O ( l o g 2 n ) O(log_2 n) O ( l o g 2 ​ n ) ,搜索时间复杂度O( l o g 2 n log_2 n l o g 2 ​ n

100000614 - 《算法笔记》9.5小节——数据结构专题(2)->平衡二叉树(AVL)

流过昼夜 提交于 2020-02-17 23:13:36
文章目录 9.5小节——数据结构专题(2)->平衡二叉树(AVL) 9.4.1-平衡二叉树的定义 9.4.2-AVL的基本操作 1-查找 2-插入 3-AVL树的建立 AVL树的基本操作代码集合 Codeup习题 问题 A: 算法9-9~9-12:平衡二叉树的基本操作 平衡二叉树小结 9.5小节——数据结构专题(2)->平衡二叉树(AVL) 9.4.1-平衡二叉树的定义 AVL是增加了平衡条件的二叉查找树,即对AVL树的任意结点来说其左子树与右子树高度之差的绝对值不超过1,其中左子树与右子树的高度之差称为该结点的平衡因子。 9.4.2-AVL的基本操作 其基本操作有查找、插入、建树、删除。 1-查找 和二叉查找树的查找一致 //查找 int search ( node * root , int v ) { if ( root == NULL ) { //空树,查找失败 // printf("search failed\n"); return 0 ; } if ( v == root - > v ) { // printf("%d\n",root->data); return 1 ; } else if ( v < root - > v ) { search ( root - > lchild , v ) ; } else { search ( root - > rchild , v