平衡树

平衡二叉树(AVL树)

感情迁移 提交于 2019-12-20 16:02:10
1.平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树: ⑴ 根结点的左子树和右子树的深度最多相差1; ⑵ 根结点的左子树和右子树也都是平衡二叉树。 2.平衡因子:结点的平衡因子是该结点的左子树的深度与右子树的深度之差。 3.结点的平衡因子=HL-HR 4.在平衡树中,结点的平衡因子可以是1,0,-1。 5.最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。 基本思想: 在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。 设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况: LL型 RR型 LR型 RL型 LL B = A - > lchild; A - > lchild = B - > rchild; B - > rchild = A; A - > bf = 0 ; B - > bf = 0 ; if ( FA == NULL ) root = B ; else if ( A == FA - > lchild ) FA - > lchild = B ; else FA - > rchild = B; RR B =

数据结构 树(下)

独自空忆成欢 提交于 2019-12-08 05:02:33
数据结构 树(下) 一、概述    AVL树、伸展树、红黑树搜索树算法保证最坏情况或者一系列操作情况下,搜索、插入和删除的操作的时间复杂度是 O(logn) 。本文 主要内容包含:平衡搜索树中的AVL树、伸展树、(2,4)树、红黑树 和(a,b)树、B树等实际运用的树数据结构。 二叉搜索树的删除 二、AVL树 1、基本知识 1、AVL树是维持对数 O(logn) 的高度的特殊二叉搜索树。“高度”指根节点到叶子节点最长路径上的节点的数量。“None”的孩子的高度是0,叶子节点的高度是1,父节点是叶子节点的高度加1 2、AVL树具有 高度平衡属性:对于树T的每个位置P,P的孩子的高度最多相差 1。AVL树子树也是一颗AVL树! 3、一个高度为h(h≥3)的拥有最少节点的AVL树,必须有两颗子树:一颗高度 h-1,另一颗高度为 h-2:n(h)=1+n(h-1)+n(h-2) h≥3 (n(1)=1、n(2)=2) 4、AVL树的高度h和节点总数n的关系: h < 2log n +2 5、AVL树平衡因子是指位置p的两颗子树高度差 (左树减右树/右树减左树) ,平衡因子 的绝对值 不大于1。 2、更新操作 1、插入,AVL树在叶子节点产生一个新的节点插入新节点p,导致p的祖先节点不满足高度平衡属性,通过trinode重组,两次“旋转”重建树T,使其满足AVL树的高度平衡属性 2、删除

数据结构 -- AVL树

一曲冷凌霜 提交于 2019-12-05 03:50:13
简介    定义 :在计算机科学中, AVL树 是 最先发明 的 自平衡二叉查找树 。在AVL树中任何节点的 两个子树的高度最大差别为1 ,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。    性质 : 1. 本身首先是一棵二叉搜索树。       2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值( 平衡因子 )最多为1。    平衡因子 :树中任意节点的 左子树高度 和 右子树高度 之差    平衡因子 = | 左子树高度 - 右子树高度 |    AVL树 中的任意一个结点, 其 平衡因子 的绝对值 小于2 , AVL树 是一种 特殊 的二叉搜索树 (BST树)。   在一些情况下,会打破 AVL树 的 自平衡性 ,或者在 添加删除 时 打破了平衡性 。所以 AVL树 定义了 旋转操作 , 在 平衡因子 大于等于2时 , AVL树 会旋转来 调整树的结构 , 来重新 满足 平衡因子 小于2。   失去平衡后进行进行的规律可归纳为下列 四种 情况:   (一) 单向右旋转处理 LL :由于在A的 左子树根结点的左子树上插入结点 ,A的平衡因子由1增至2,致使以 A为根的子树失去平衡 ,则需进行 一次右旋转 操作;   (二) 单向左旋平衡处理 RR :由于在A的 右子树根结点的右子树上插入结点 ,A的平衡因子由-1变为-2,致使

MySQL用B+树做索引

非 Y 不嫁゛ 提交于 2019-12-05 03:15:26
索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: B+树索引、Hash索引、全文索引 我们今天要介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。 要介绍B+树索引,就不得不提二叉查找树,平衡二叉树和B树这三种数据结构。B+树就是从他们仨演化来的。 二叉查找树 首先,让我们先看一张图  从图中可以看到,我们为user表(用户信息表)建立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。 键对应user表中的id,数据对应user表中的行数据。二叉查找树的特点就是 任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 如果我们需要查找id=12的用户信息,利用我们创建的二叉查找树索引,查找流程如下: 1.

php利用多叉树(平衡树)的方式构建无限分类

馋奶兔 提交于 2019-12-05 02:17:45
说起无限分类..大多数的结构都是 id name parent_id 这种模式.整个结构比较简单清晰.要构建和更新整个分类也比较容易.但是查询起来就会非常的麻烦.经常会用到递归的算法.例如 获取某个节点的所有父节点之类. 今天说一说通过多叉树的方式构建无限分类,结构上可能会复杂一点,构建和更新也比较麻烦.但是查询非常方便.两种方法的优劣就不评论了. 先看一张图 这是我们要构建的无限分类的模型. 电子产品是最大的分类.家用电器 ,数码产品是其子分类.可以看到子分类是被父分类包含起来的.每个分类都有左右 两个节点编号分别是1、2、3..... 根据上面的图mysql中建立表和插入数据 CREATE TABLE `product_categories` ( `id` MEDIUMINT( 8 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 20 ) NOT NULL , `left_node` MEDIUMINT( 8 ) NOT NULL , `right_node` MEDIUMINT( 8 ) NOT NULL ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; INSERT INTO `product_categories` (`id`,

数据结构中各种树

a 夏天 提交于 2019-12-03 23:09:33
阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树   数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。 回到顶部 1. 二叉树   二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。 二叉树的定义: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2 i-1 个结点;深度为k的二叉树至多有2 k-1 个结点;对任何一棵二叉树T,如果其终端结点数为n 0 ,度为2的结点数为n 2 ,则n 0 =n 2 +1。 二叉树的示例 : 满二叉树和完全二叉树:   满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。   满二叉树的性质:   1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;   2) 叶子数为2 h ;   3) 第k层的结点数是:2 k-1 ;   4) 总结点数是:2 k-1 ,且总节点数一定是奇数。   完全二叉树

平衡二叉树(二叉搜索树)

有些话、适合烂在心里 提交于 2019-12-02 23:32:49
    平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。   特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。    二叉查找树实际上是数据域有序的二叉树, 即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域, 右子树上所有结点的数据域均大于根结点的数据域。如下图所示: 其中左节点要比当前子树根节点小,右节点要比当前子树根节点大,如第一次进入二叉树, 根节点为temp为5,再进来3和根节点比较,发现根节点的左节点为空,所以3放在5的左节点,进来7,比5大,5的右节点为空,7到5的右节点,再进来2,找到5,比5小,进去继续找,发现5的左节点不为空,temp为3作当前小平衡树的根,发现3的左为空,此时将2放到3的左节点.... 代码实现: #include<stdio.h> #include<stdlib.h> typedef struct node{ int

AVL树的插入删除操作

时光总嘲笑我的痴心妄想 提交于 2019-11-29 21:11:57
//.......................avl.h #pragma once #include < iostream > #include < stack > using namespace std; //................................动态平衡树-----AVL树 template < class Type > class AVL; //结点类 template < class Type > class AVLNode { friend class AVL < Type > ; public : AVLNode(): data ( Type ()),leftChild( NULL ),rightChild( NULL ),bf( 0 ) {} AVLNode( Type d,AVLNode < Type > * left = NULL ,AVLNode < Type >* right = NULL ) : data (d),leftChild(left),rightChild(right),bf( 0 ) {} ~AVLNode() {} private : Type data ; AVLNode * leftChild; AVLNode * rightChild; int bf; }; //AVL类 template < class

红黑树(自平衡的二叉查找树)

放肆的年华 提交于 2019-11-29 04:54:48
30张图带你彻底理解红黑树 红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理? 红黑树定义和性质 红黑树是一种 含有红黑结点并能自平衡的二叉查找树 。它必须满足下面性质: 性质1:每个节点要么是黑色,要么是红色。 性质2: 根节点 是 黑色 。 性质3:每个 叶子节点 (NIL)是 黑色 。 性质4:每个 红色结点的两个子结点 一定都是 黑色 。 性质5: 任意一结点到每个叶子结点 的路径都 包含数量相同的黑结点 。 性质5.1:如果 一个结点存在黑子结点 ,那么 该结点肯定有两个子结点 (在Java中, 叶子结点 是 为null 的结点。) 图1就是一颗简单的红黑树。其中Nil为叶子结点,并且它是黑色的。(值得提醒注意的是,在Java中,叶子结点是为null的结点。) 红黑树并 不是 一个 完美平衡(左右子树高度相差为0)二叉查找树 ,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的 黑结点的层数是相等的 ,也即 任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点 (性质5)。所以我们叫红黑树这种平衡为 黑色完美平衡 。 我们把 正在处理(遍历)的结点 叫做 当前结点 ,如图2中的D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。 红黑树自平衡 红黑树能自平衡,它靠的是什么?三种操作: 左旋

AVL树(二叉平衡树)详解与实现

血红的双手。 提交于 2019-11-28 12:34:35
AVL树概念 前面学习 二叉查找树 和 二叉树的各种遍历 ,但是其 查找效率不稳定 (斜树),而二叉平衡树的用途更多。查找相比稳定很多。( 欢迎关注 数据结构专栏 ) AVL树是 带有平衡条件的二叉查找树 。这个平衡条件必须要 容易保持 。而且要保证它的深度是O(logN). AVL的条件是左右树的高度差( 平衡因子 )不大于1;并且它的每个子树也都是平衡二叉树。 对于平衡二叉树的最小个数, n0=0 ; n1=1 ; nk=n(k-1)+n(k-2)+1 ;(求法可以类比斐波那契!) 难点:AVL是一颗二叉排序树,用什么样的规则或者规律让它能够在 复杂度不太高 的情况下 实现动态平衡 呢? 不平衡概况 如果简单的以单节点看,大致有上面 四种 情形,并且他们的最后结果也是有的有所相近。只是:上下会变动。 该在左面的还在左面,改在右面的还在右面 。 这只是针对在底部,对于可能出现的平衡要首先搞清楚: 所以针对四种不平衡, 可能出现在底部,也可能出现在头,也可能出现在某个中间节点导致不平衡。 而我们只需要研究其首次不平衡点, 解决之后整棵树即继续平衡 。当然,在实际解决肯定会带上 递归 的思想解决问题。 # 四种平衡旋转方式 RR平衡旋转(左单旋转) 出现这种情况的原因是节点的 右侧的右侧较深 这时候 不平衡节 点需要 左旋 。再细看过程。 再左旋的过程中, root(oldroot)