avl

AVL树(Java)

余生长醉 提交于 2020-02-09 14:03:36
AVL树 在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 特点 1.本身首先是一棵 二叉搜索树 。 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说, AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树) 平衡因子 某 结点的左子树与右子树的高度(深度)差 即为该结点的平衡因子(BF,Balance Factor)。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。 高度(height) 为了方便计算每一结点的平衡因子我们可以为每个节点赋予height这一属性,表示此节点的高度。 这里的高度是由叶子节点从下向上计算的,叶子节点的height是1,叶子节点的父节点height是2,以此类推。 旋转 AVL树的基本操作一般涉及运做同在不平衡的二叉查找树所运做的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL 旋转"。 假设由于在二叉排序树上插入结点而失去平衡的最小子树根结点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先结点),则失去平衡后进行进行的规律可归纳为下列四种情况: 单向右旋平衡处理LL :由于在a的左子树根结点的左子树上插入结点,a的平衡因子由1增至2

平衡二叉树及其C++实现-AVL

China☆狼群 提交于 2020-01-14 23:56:58
title: 平衡二叉树(AVL) date: 2020-01-14 11:26:36 tags: 数据结构 1.1平衡二叉树的定义 为了解决二叉查找树如果插入的顺序不合适,会导致二叉查找树变成一个单链(可以看二叉查找树文章当中的讨论),例如按照递增序列建立二叉查找树就会导致一边倒的情况,从而无法发挥二叉树可以使得查找保持O(logn)查找的效率。故由使得二叉树的层数越小,导出了平衡二叉树。 AVL依然是一棵二叉查找树 (AVL的命名是由发现这个树的两个苏联科学家G.M.Adekse-Velskil和E.M.Landis提出的),因此一般也称作AVL树。 左子树和右子树的高度之差称为该结点的平衡因子 由于需要对每个结点都要得到平衡因子,故在树的结点中加入一个height用以记录当前结点为根结点的子树的高度 struct node { int v, height; //v为结点权值 height为当前子树高度 node *lchild, *rchild; //左右孩子结点地址 }; 新建结点写法: node* newNode(int v) { node* Node = new node; Node->v = v; //结点权值 Node->height = 1; //结点高度初始为1 Node->lchild = Node->rchild = NULL; //初始状态无左右孩子

二叉查找树(查找、插入、删除)——C语言

瘦欲@ 提交于 2020-01-08 06:29:48
AVL树 平衡二叉查找树(Self-balancing binary search tree)通常是指一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且任意节点的左右两个子树都是一棵平衡二叉树(即严格的平衡二叉查找树, “严格”二字体现在任意节点的左右子树高度差不超过1 ),平衡二叉树有多种实现方法(红黑树、AVL、替罪羊树、Treap、伸展树等) 本篇随笔分析的AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本(AVL树是严格的二叉查找树,而红黑树不是,红黑树是非严格的二叉查找树,红黑树有自己的一套规则来保证整棵树接近平衡) AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时)

再回首数据结构—AVL树(一)

假如想象 提交于 2020-01-08 04:26:30
前面所讲的二叉搜索树有个比较严重致命的问题就是极端情况下当数据以排序好的顺序创建搜索树此时二叉搜索树将退化为链表结构因此性能也大幅度下降,因此为了解决此问题我们下面要介绍的与二叉搜索树非常类似的结构就诞生了;    AVL(Adelson-Velskii and Landis)树 ,名字取自其发明者 G.M. Adelson-Velsky 和 E.M. Landis的首字母,AVL树是一棵特殊的二叉搜索树它与普通二叉搜索树最主要的区别就是其能够使二叉搜索树维持其左右节点的平衡;    AVL树: 其任意一个节点左子树与右子树高度差不超过1,由于此特征因此需要在AVL增删节点时维护其左右节点使该树满足该特性(左右节点平衡);   此AVL树中节点2节点高度都为2,节点1与3节点高度都为1;节点高度为左右子树中最大的节点高度+1; AVL树实现关键    1、标注其节点高度    2、计算节点平衡因子    3、维护其节点满足左右节点高度不超过1 AVL树的实现   1、AVL树定义   根据AVL树的特性先定义该数据类型的结构; type AVL struct { root *AVLNode size int compare Comparable } type AVLNode struct { e interface{} left *AVLNode right *AVLNode

AVL树---平衡的二叉查找树

南楼画角 提交于 2020-01-08 02:35:08
AVL树 是每个结点的左子树和右子树的高度最多差1的 二叉查找树 (空树的高度定义为-1)。 它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 AVL树的性质 : 左子树和右子树的高度差不超过1 每个结点的左子树和右子树都是AVL树 每个结点都有一个平衡因子,任一结点的平衡因子是-1,0,1。每个结点的平衡因子等于右子树高度减去左子树的高度 AVL树是在二叉查找树的基础上建立的,我们知道二叉查找树在最坏情况下(每个结点只有左子树或右子树)增删查的时间复杂度是O(N),这种极端的情况下树是高度不平衡的。 在二叉查找树的基础上,如果使左右子树的高度差不超过1,即达到高度平衡的状态,此时增删查的时间复杂度为O(logN)(2为底数)。 为了让它保持高度平衡,我们引入了平衡因子,每个结点的平衡因子只可能是-1,0,1中的一个。 每次插入/删除一个结点,我们都需要向上更新一下新增结点/删除结点的祖先的平衡因子。一旦发现某个祖先的平衡因子变为2或者-2,我们就需要通过旋转来使这棵树保持AVL树的特性。 来源: https://www.cnblogs.com/i-hard-working/p/10749998.html

7、AVL 树

筅森魡賤 提交于 2019-12-27 17:53:04
1、 AVL 树 AVL 树的名字来源于它的发明作者 G.M. Adelson-Velsky 和 E.M. Landis 。 AVL 树是最先发明的自平衡二叉查找树( Self-Balancing Binary Search Tree ,简称平衡二叉树)。 定义: 它或者是一颗空树,或者具有以下性质的二叉查找树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 时间复杂度: AVL 树的查找、插入、删除操作在平均和最坏的情况下都是 O(logn) ,这得益于它时刻维护着二叉树的平衡。如果我们需要查找的集合本身没有顺序,在频繁查找的同时也经常的插入和删除, AVL 树是不错的选择。 相关操作: AVL 树失衡分类: 如果在 AVL 树中进行插入或删除节点后,可能导致 AVL 树失去平衡。这种失去平衡的可以概括为4种姿态: LL (左左), LR (左右), RR (右右)和 RL (右左)。它们都有各自的定义: LL:LeftLeft ,也称为"左左"。插入或删除一个节点后,根节点的左子树的左子树还有非空子节点,导致"根的左子树的高度"比"根的右子树的高度"大2,导致 AVL 树失去了平衡。 LR:LeftRight ,也称为"左右"。插入或删除一个节点后,根节点的左子树的右子树还有非空子节点,导致"根的左子树的高度"比

AVL树之 Java的实现

假装没事ソ 提交于 2019-12-22 01:50:20
AVL树的介绍 AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。 AVL树的Java实现 1. 节点 1.1 节点定义 public class AVLTree<T extends Comparable<T>> { private AVLTreeNode<T> mRoot; // 根结点 // AVL树的节点(内部类) class AVLTreeNode<T extends Comparable<T>> { T key; // 关键字(键值) int height; // 高度 AVLTreeNode<T> left; // 左孩子 AVLTreeNode<T> right; // 右孩子 public AVLTreeNode(T key, AVLTreeNode<T> left, AVLTreeNode<T> right) { this.key = key; this.left = left; this.right = right; this.height = 0; } } ...... } AVLTree是AVL树对应的类

MySQL中B+Tree索引原理

試著忘記壹切 提交于 2019-12-10 01:59:22
B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。 B+树的特征: 1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。 2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。 3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。 B+树的优势: 1.单一节点存储更多的元素,使得查询的IO次数更少。 2.所有查询都要查找到叶子节点,查询性能稳定。 3.所有叶子节点形成有序链表,便于范围查询。 二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次 二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字

AVL树的介绍和实现

别等时光非礼了梦想. 提交于 2019-12-03 02:47:27
一、AVL树 AVL树是一种自平衡二叉查找树,因此在了解AVL树之前先介绍一下平衡二叉树。所谓平衡二叉树即该树中的任一个节点的左子树和右子树高度差不会超过1。如下图左是平衡二叉树,而右 图 则不是。 来源: https://www.cnblogs.com/lbrs/p/11774572.html

模拟平衡二叉查找树底层实现(AVL)

匿名 (未验证) 提交于 2019-12-03 00:29:01
GitHub源码地址:(https://github.com/BradenLei/AVL) 1、基本概念及操作: 1)平衡二叉查找树:在二叉查找树的基础上满足平衡因子为-1,0,1的树结构 2)平衡因子:右子树的高度减去左子树的高度;-1表示左偏重,+1表示右偏重 3)重新平衡数:从AVL树中插入或者删除一个元素后,如果树变得不平衡了,执行一次旋转操作来重新平衡该树,有四种方式: LL旋转、RR旋转、LR旋转、RL旋转 以 LL说明:两个L表示两次左偏重 4)AVL树的设计:由于AVL树是二叉查找树,AVLTree设计为BST的子类(BST实现在上一篇博文中,这里不再累述) 5)重写insert、delete方法:AVL树中的这两操作基本一致,不同之处在于树可能需要重新平衡。 6)AVL树的高度为O(logn),所以其search、insert以及delete方法的时间复杂度为O(logn) AVL实现: package binary; import java.util.ArrayList; public class AVLTree<E extends Comparable<E>> extends BST<E> { public AVLTree() { } public AVLTree(E[] objects) { super(objects); } @Override