首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AVL计算平衡因子计算与AVL旋转类型Java代码

1、本篇博文目标 AVL为了保证平衡因子绝对值不大于1,需要对节点进行旋转。如下面的这篇博文所示。...AVL旋转_Colourful.博客-CSDN博客_avl旋转 如果想要对进行旋转,就需要具备两个先要条件 (1)平衡因子判断 (2)旋转类型 2、如何计算平衡因子和不平衡情况下旋转类型...所以只需要通过递归方式计算左子树和右子树差值即可。所以问题就转换成了计算深度。 【旋转类型】 通过上面的引用博文可知,旋转需要知道是是下面的那种类型?...(1)left- left (2) right - right (3) left -right (4) right -left 计算是那种类型只需要在深度计算时候,对进行递归时候记录递归路径即可...另外一个是trace, //是arrayLIst集合,该集合就记录了旋转类型 //计算平衡因子只需要把getDepth(左子树节点)depth和getDepth右子树depth相减即可。

56700

平衡二叉 AVL 插入节点旋转方法分析

平衡二叉 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序,其中每一个节点左子树和右子树高度差至多等于1。...注:AVL 也是一种二叉查找,故删除策略可以参照前面文章来实现,只是删除节点,如果平衡被打破,则也需要进行旋转以保持平衡。...中序遍历输出,即1~16顺序排列。...注意:输入数组元素就不要搞成有序了,如果代码中没有调整实现,整个就是个右斜,但即使实现了调整,也会使得每插入一次就调整一次,何必内耗啊。...很显然,平衡二叉优势在于不会出现普通二叉查找最差情况。其查找时间复杂度为O(logN)。

1.1K00
您找到你想要的搜索结果了吗?
是的
没有找到

【C++修炼之路】20.手撕红黑

AVL结构及其相关性质,对于平衡来说,AVL无疑是最完美的结构,但实际上AVL由于完美的结构因此也要花费一定代价,由于AVL结构很敏感,查找虽然最快,但插入节点一旦偏离AVL结构就会进行旋转...可见红黑这种结构,虽然在不满足条件时会发生旋转,但敏感程度相比AVl大大降低。...二.红黑结构 2.1 红黑树节点定义 相比较AVL,红黑结点仍是三叉链这个结构,为后续不满足结构条件旋转做准备。...插入节点颜色必须为红 ---- 检测新节点插入,红黑性质是否造到破坏 因为新节点默认颜色是红色,因此:如果其双亲节点颜色是黑色,没有违反红黑任何性质,则不需要调整;但当新插入节点双亲节点颜色为红色时...和上篇中AVL一样,对于这种弯结构,只进行一次旋转是不可能成功,因此需要进行两部旋转,上图只旋转了一次,变成了情况2,因此需要再旋转一次,就能满足红黑树结构性质

31600

【动态图文详解,史上最易懂红黑讲解】手写红黑(Red Black Tree)

红黑性质(规则) 红黑是一种含有红黑结点并能自平衡二叉查找。它必须满足下面性质性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。...反证法:假设有一颗红黑满二叉结点都为黑色结点时,此时添加一个黑色结点,不满足(5)特性,但是就算经过旋转,也无法满足(5)特性,大家都是黑色,变不了红黑。...不满足性质4:每个红色结点两个子结点一定都是黑色。需要进行RB变色。 ? 旋转 当破坏了平衡时,在调整时候需要用到左旋和右旋: ? ?...因此插入结点最多只需要2次旋转,这一点和AVL插入操作一样。虽然变色操作需要O(logN),但是变色操作十分简单,代价很小。...(3) 删除代价: RBT删除操作代价要比AVL要好的多,删除一个结点最多只需要3次旋转操作。

15.3K20

C++之红黑

前言 前面一节我们介绍了平衡搜索二叉AVL,我们知道,AVL虽然查找效率很高,但是不能过多修改,因为它为了保持平衡要不断进行旋转。...我们今天介绍红黑也是一种平衡搜索,不过它所要求平衡没有AVL那么严格,因此对它进行修改操作时所要进行旋转AVL要进行旋转少。...第二步、分析插入结点红黑性质是否被破坏 新结点默认为红色, 1.如果双亲节点颜色是黑色,则没有违反红黑性质,不需要调整; 2.如果双亲节点颜色是红色,则违反性质4需要进行调整。...动态演示: 升序: 降序: 随机插入构建红黑: 右旋转: 左旋转: 六、验证红黑 验证红黑分为两步: 1.检测是否满足二叉搜索 中序遍历是否为有序序列...相对而言,插入和旋转次数更少,在经常进行增删结构中性能比AVL更优,而且红黑实现比AVL简单,因此更加常用。 总结 以上就是今天要讲内容,本文介绍了C++中红黑相关概念。

43330

平衡搜索二叉之红黑(拒绝死记硬背,拥抱理解记忆)

每个叶子结点都是黑色(此处叶子结点指的是空结点) ---- 思考:为什么满足上面的性质,红黑就能保证:其最长路径中节点个数不会超过最短路径节点个数两倍? 答案:下面标黄处。...三、红黑实现 在把红黑逻辑了解完,我们来实现一下吧。...检测新节点插入,红黑性质是否造到破坏,     // 若满足直接退出,否则对红黑进行旋转着色处理 }     // 根节点颜色可能被修改,将其改回黑色     pRoot->_color =...; }; ② 检测新节点插入,红黑性质是否造到破坏(重点) 先看每种情况下如何处理,最后有总结帮助记忆 因为新节点默认颜色是红色,因此:如果其双亲节点颜色是黑色,没有违反红黑任何 性质,则不需要调整...旋转是啥,你不知道,惩罚你去看这篇文章前传——avl篇有解释)。

21120

【高阶数据结构】红黑详解

大家可以对照着看一下上面的图,看它是否满足这些性质。 思考:为什么满足上面的性质,红黑就能保证:其最长路径中结点个数不会超过最短路径结点个数两倍?...比如这样 那另外: 其实分析上面的性质,红黑是可以全黑,全部黑色结点,只要满足上面的性质即可。...当然不是,和AVL一样,插入新结点之后,我们要去判断此时这棵是否还满足是一棵红黑,如果不满足就要进行相应调整。 那红黑又是如何进行调整呢? 4....如果g是根节点,调整完成,需要将g改为黑色。 这样它才满足是一棵红黑。 那上面是g是根结点情况,那如果g是一棵子树呢?...因为AVL在插入和删除节点,会进行更多旋转操作以维持一个较为严格平衡,所以插入和删除操作时间复杂度更高。

18010

AVL和红黑(map和set底层实现)

一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL 左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) ?...如果pParent平衡因子为0,说明插入之前pParent平衡因子为正负1,插入被调整成0,此时满足AVL性质,插入成功 2....红黑性质 每个结点不是红色就是黑色 根节点是黑色 如果一个节点是红色,则它两个孩子结点是黑色 对于每个结点,从该结点到其所有后代叶结点简单路径上,均 包含相同数目的黑色结点 每个叶子结点都是黑色...检测新节点插入,红黑性质是否造到破坏, // 若满足直接退出,否则对红黑进行旋转着色处理 } // 根节点颜色可能被修改,将其改回黑色 pRoot->_color...红黑检测分为两步: 检测其是否满足二叉搜索(中序遍历是否为有序序列) 检测其是否满足红黑性质 bool IsValidRBTree(){ Node* pRoot = _root; /

1K10

红黑简单介绍

例如: 下图就是一个红黑,同时也是一颗二叉搜索AVL不同是,AVL依靠着平衡因子限制平衡性比红黑要更高 红黑性质 1. 每个结点不是红色就是黑色 2....每个叶子结点都是黑色(此处叶子结点指的是空结点) 我们要尤其注意一个点: 红黑叶子节点是空节点,而非我们之前传统意义上叶子节点 对于性质3简化就是,一条路径上不能出现连续红节点 基于上面给出性质...2倍,他要求并没有AVL那么严格,所以红黑旋转次数要比AVL少很多,效率自然就提升了,故而实际应用中红黑要比AVL更多一些。...检测新节点插入,红黑性质是否造到破坏 因为新节点默认颜色是红色,因此:如果其双亲节点颜色是黑色,没有违反红黑任何性质,则不需要调整;但当新插入节点双亲节点颜色为红色时,就违反了性质三不能有连在一起红色节点...检测其是否满足二叉搜索(中序遍历是否为有序序列) 2. 检测其是否满足红黑性质 由于博主能力有限,本篇博文分享到这里就结束了,感谢大家支持!

7610

红黑原理及实现

左旋:设x为当前结点,y为x结点,β为y左节点,P为x结点,则x以y为支点进行左旋转旋转,P指向y, x结点指向β, y结点指向x。...右旋:设y为当前结点,x为y结点,β为x结点,P为y结点,则y以x为支点进行右旋转旋转,P指向x,y结点指向β,x结点指向y。...解释:这种形态经过一次变换就可以满足红黑性质,首先将父结点设置为黑色满足性质四,但是违反了性质5,然后将祖父结点设置为红色,通样则父结点这个分支满足了红黑性质,但是叔叔结点分支违反了性质5。...所以需要再将祖父结点右旋,这样全部都满足了红黑性质。...2.删除第三种情况和插入第二种情况也类似,这种情况下树形态都不能一次性转化为满足红黑性质形态,都需要做一次中转,变成可以通过一次操作满足红黑性质形态。

43110

树结构系列(二):平衡二叉AVL、红黑

AVL 虽然查询效率高,但是插入、删除效率低,需要不断旋转以保持平衡。而红黑通过牺牲一些查询效率,提高了插入、删除效率。 AVL AVL 是最早发明自平衡二叉查找。...为了保持红黑性质,我们可以对相关结点做一系列调整,通过对进行旋转(例如左旋和右旋操作),即修改中某些结点颜色及指针结构,以达到对红黑进行插入、删除结点等操作时,红黑依然能保持它特有的五个性质...旋转操作本身并不复杂,这里先分析到这吧。 插入操作 红黑插入过程和二叉查找插入过程基本类似,不同地方在于,红黑插入新节点,需要进行调整,以满足红黑性质。...插入红色节点,会出现 5 种情况,分别如下: 情况一 插入新节点 N 是红黑根节点,这种情况下,我们把节点 N 颜色由红色变为黑色,性质 2(根是黑色)被满足。...同时 N 被染成黑色,红黑所有路径上黑色节点数量增加一个,性质 5(从任一节点到其每个叶子所有简单路径都包含相同数目的黑色节点)仍然被满足

87820

彻底搞懂红黑

红黑性质 1、每个结点或是红色,或是黑色 2、根节点是黑色 3、每个叶结点(NIL)是黑色 4、如果一个节点是红色,则它两个儿子都是黑色。...5、对于每个结点,从该结点到其叶子结点构成所有路径上结点个数相同。 和AVL比较 AVL是一棵严格平衡,它所有的子树都满足二叉平衡定义。...因此AVL高被严格控制在XXX,因此AVL查找比较高效。但AVL插入、删除结点旋转次数比红黑多。 红黑用非严格平衡来降低插入删除时旋转次数。...由于黑节点个数至少为红节点两倍,因此父为黑情况较多,而这种情况在插入无需任何调整,这就是红黑AVL插入效率高原因! 2....要么有且仅有一个左孩子 然后将孩子顶替它原来位置,最后将被删节点值覆盖待删除那个节点A。 红黑按照二叉搜索方式删除节点,之后再进行相应旋转操作,使得删除仍然是一棵红黑

98440

【C++】“旋转!跳跃!我闭着眼!”—— 从零开始构建AVL

所以就有了改进版二叉搜索->AVL(平衡二叉搜索) 在1962年,两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis发明了一种解决上述问题方法:当向二叉搜索中插入新结点...一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL 左右子树高度之差(简称平衡因子)绝对值不超过1(-1 / 0 / 1 ) 如果一棵二叉搜索是高度平衡,它就是AVL...首先选择有四种:右单旋 ,左单旋,左右双旋,右左双旋 我们依次来介绍: ️右单旋: 我们先来看什么情况需要使用右单旋: 这是最简单情况,简单向右旋转,使其满足AVL性质!...parent满足AVL性质! ️...说明相比原来,高度并没有变化(由 0 删除一边而来),可以停止更新平衡因子 ⚠️parent 修改变为 ∓2 : 说明两边此时高度差不满足AVL,需要进行旋转

1000

C++之AVL

一棵AVL要具有以下性质: 该如果是空,那么它是AVL; 它左右子树是AVL; 左右子树高度差(命名为平衡因子)绝对值不超过1(可以是1/0/-1) 上图红色标识是该结点平衡因子...平衡因子为0,说明新插入结点不影响该子树高度,满足AVL性质,不再进行调整 //pparent平衡因子为±1,说明插入前pparent平衡因子为0,此时以pparent为根子树高度加1...如果新增节点就是60,那么旋转平衡因子更新如下: 30结点/60结点/90结点平衡因子都为0; 如果新增节点在60结点左子树,那么旋转平衡因子更新如下: 30结点平衡因子为1;...平衡因子为0,说明新插入结点不影响该子树高度,满足AVL性质,不再进行调整 //pparent平衡因子为±1,说明插入前pparent平衡因子为0,此时以pparent为根子树高度加1...但是如果对AVL做一些结构修改操作,它性能就会比较低下,例如,插入元素时要维护其绝对平衡性质旋转次数会比较多。其中删除效果最差,有可能让旋转一直持续到根节点。

78950

红黑

通过对任何一条从根到叶子路径上各个结点着色方式限制,红黑确保没有一条路径会比其他路径长出俩倍,因而是接近平衡。 红黑,作为一棵二叉查找满足二叉查找一般性质。...为了继续保持红黑性质,可以通过对结点进行重新着色,以及对进行相关旋转操作,即通过修改中某些结点颜色及指针结构,来达到对红黑进行插入或删除结点等操作后继续保持它性质或平衡目的。...对于旋转,能保持不变只有原搜索性质,而原红黑性质则不能保持,在红黑数据插入和删除可利用旋转和颜色重涂来恢复红黑性质。...操作:先旋转再变色 经过P、G变换(旋转),变换P位置就是当年G位置,所以红P变为黑,而黑G变为红都是为了不违反性质5,而维持到达叶节点所包含黑节点数目不变!...四、红黑AVL区别 红黑旋转操作非常局部化,而且次数极少(插入最多两次旋转,删除最多三次旋转),而改变颜色操作不会影响到用户对query操作(即不要lock),另外很多,如AVL,2

73740

完全平衡二叉、红黑区别

但是提出了为节点增加颜色,红黑是用非严格平衡来换取增删节点时候旋转次数降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡,因此在增加或者删除节点时候,根据不同情况,旋转次数比红黑要多...,而红黑为了维持红黑性质所做红黑变换和旋转开销,相较于avl为了维持平衡 开销要小得多。...AVL定义: 一棵AVL满足以下条件: 1>它左子树和右子树都是AVL 2>左子树和右子树高度差不能超过1 从条件1可能看出是个递归定义,如GNU一样....性质: 1> 一棵n个结点AVL其高度保持在0(log2(n)),不会超过3/2log2(n+1) 2> 一棵n个结点AVL平均搜索长度保持在0(log2(n)). 3> 一棵n个结点AVL...删除一个结点做平衡化旋转所需要时间为0(log2(n)).

50610

平衡二叉

如下图所示,不平衡原因是因为A左孩子B左子树插入了新结点而导致了A不平衡,那么就要利用LL旋转来调整不平衡结点A,由于平衡二叉一定是二叉搜索,设定插入结点为C,那么根据二叉搜索性质一定有...,A>B>C,那么进行如下调整:把B当作根节点,A作为B右子树(二叉搜索性质)。...如下图所示,不平衡原因是因为A右孩子B右子树插入了新结点而导致了A不平衡,那么就要利用RR旋转来调整不平衡结点A,由于平衡二叉一定是二叉搜索,设定插入结点为C,那么根据二叉搜索性质一定有...如下图所示,不平衡原因是因为A左孩子B右子树插入了新结点而导致了A不平衡,那么就要利用LR旋转来调整不平衡结点A,由于平衡二叉一定是二叉搜索,设定插入结点为C,那么根据二叉搜索性质一定有...如下图所示,不平衡原因是因为A右孩子B左子树插入了新结点而导致了A不平衡,那么就要利用RL旋转来调整不平衡结点A,由于平衡二叉一定是二叉搜索,设定插入结点为C,那么根据二叉搜索性质一定有

64540

C++:红黑

通过对任何一条从根到叶子路径上各个结点着色方式限制,红黑确保没有一条路径会比其他路径长出2倍,因而是接近平衡。  红黑性质 ⭐1.每个节点不是红色就是黑色。 ⭐2.根节点是黑色。...也就是说每条路径都有相同数量黑色节点。 ⭐5.每个叶子结点都是黑色(此处叶子结点指的是空结点。 从性质上分析红黑近似平衡 一颗红黑最短路径是这条路径全黑。最长是一红一黑相间路径。...第二步:检测新节点插入,红黑性质是否造到破坏。...红黑旋转直接复用AVL旋转代码即可。 验证红黑 红黑验证分两步:①通过中序遍历验证其是否满足二叉搜索性质。②验证是否满足红黑性质。...⭐不同点:红黑不追求绝对平衡,其只需保证最长路径不超过最短路径2倍,相对而言降低了插入和旋转次数。而AVL是高度平衡二叉搜索旋转次数比红黑要频繁。

22820

Java - 数据结构之

则平衡二叉所有节点平衡因子只可能是-1,0,1。 在插入或者删除结点时,为了满足平衡二叉性质,就需要进行自平衡操作,即二叉旋转。...AVL是最早发明自平衡二叉查找,是最原始典型平衡二叉AVL指的是发明该两个作者名字简称,通常说平衡二叉指的是AVL。...AVL旋转 AVL旋转类型有4种:LL(left-left)旋转、LR(left-righ)旋转、RR(right-right)旋转和RL(right-left)旋转。...接着为了满足性质4就需要进行变色,有时候只靠变色是无法保持平衡,此时就还需要进行旋转,需要具体情况具体分析。...B(B-tree) B是平衡多路查找,英文名是B-tree,有的翻译为B-,B就是balanced。B满足以下性质: 1)根结点至少有两个子女。

34720

平衡二叉数据结构_红黑数据结构

当然,还有一些更好,但实现起来更复杂数据结构,能够做到一步旋转之内达到平衡,但红黑能够给我们一个比较“便宜”解决方案。...AVL定义: 一棵AVL满足以下条件: 1>它左子树和右子树都是AVL 2>左子树和右子树高度差不能超过1 性质: 1>一棵n个结点AVL其高度保持在0(log2...(n)),不会超过3/2log2(n+1) 2>一棵n个结点AVL平均搜索长度保持在0(log2(n)). 3>一棵n个结点AVL删除一个结点做平衡化旋转所需要时间为0(log2(n...为了保证平衡,AVL每个结点都有一个平衡因子,它表示这个结点左、右子树高度差,AVL树上所有结点平衡因子值只能是-1、0、1。...红黑更新旋转次数,插入最多2次,删除最多3次;平衡二叉因为严格平衡,插入最多2次,删除可达O(n),被删除结点以上父节点皆有可能旋转

29320
领券