AVL变种-红黑树

对红黑树的操作在最坏的情形下花费O(logN)时间,相对AVL树来说,性质比较多但是换取了插入和删除时少量的旋转操作。

因为书中说的不清楚,特查看wiki做本文笔记~~

性质

  1. 节点是红色或者黑色
  2. 根为黑色的
  3. 所有叶子为黑色
  4. 每个红色节点必须有两个黑色的子节点
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点

操作

红黑树的只读操作和普通二叉查找树的操作是一样,但是插入和删除要考虑相邻节点的情况,来重新平衡性质

插入

下面用叔父节点来指代父节点的兄弟节点,当插入新节点的时候,可能会有下面几个情形需要进行修复

1.新节点N位于树的根上,没有父节点,这个时候把它重绘为黑色就可以

2.新节点父节点为黑色,新节点则为红色,满足性质

3.父节点P和叔父节点U都是红色,将两个重绘为黑色并重绘祖父节点为红色,如下

  

  然后把G当做当前节点进行操作

4.父节点P是红色而叔父节点为黑色,P是G的左子节点,N是P的右子节点,也就是AVL的之字形(还有另一种对称情况)

  这种情况下需要进行一次左旋转

5.父节点P是红色,叔父节点是黑色,N是P的左子节点,P是G的左子节点,对G进行一次右旋转

删除

要么在它的左子树中的最大元素、要么在它的右子树中的最小元素,并把它的值转移到要删除的节点中;接着就可以删除被复制值的节点。

它必定有少于两个非叶节点,所以问题可以简化为如何删除最多有一个儿子节点的问题!!!

先根据被删除节点来划分

  • 红色节点,简单用黑色儿子替换它就可
  • 黑色节点且儿子为红色,替换节点后,重绘节点为黑色

这样就剩下删除节点是黑色,而且儿子为黑色的情况了,假设已经替换好了儿子为N(原位置的已经删除),兄弟节点为S,P为父亲,SL、SR为S的左儿子右儿子

如果N和它原来的父亲都是黑色(父亲已经被删除),会导致通过N比不通过N少了一个黑色节点,需要分为下面几个情况解决

1.N是新的根,已经完成了

2.S为红色,对P做左旋转,S作为N的祖父,对调P和S的颜色,这样会转变为4、5、6

3.P、S、SL、SR都是黑色的,重绘S为红色

因为删除N的初始的父亲使通过N的所有路径少了一个黑色节点,这使事情都平衡了起来。但是,通过P的所有路径现在比不通过P的路径少了一个黑色节点,所以仍然违反性质5。要修正这个问题,我们要从情形1开始,在P上做重新平衡处理。

4.S、SL、SR都是黑色的,P是红色,交换S和P的颜色

这不影响不通过N的路径的黑色节点的数目,但是它在通过N的路径上对黑色节点数目增加了一,添补了在这些路径上删除的黑色节点。

5.S 、SR是黑色,SL是红色,N是P的左儿子,对S做右旋转,交换S和新父亲的颜色,进入6

6.S是黑色,SR是红色,N是P的左儿子,对P做左旋转,交换N的父亲和S的颜色,使S的右儿子为黑色

此时,如果一个路径不通过N,则有两种可能性:

  • 它通过N的新兄弟。那么它以前和现在都必定通过S和N的父亲,而它们只是交换了颜色。所以路径保持了同样数目的黑色节点。
  • 它通过N的新叔父,S的右儿子。那么它以前通过S、S的父亲和S的右儿子,但是现在只通过S,它被假定为它以前的父亲的颜色,和S的右儿子,它被从红色改变为黑色。合成效果是这个路径通过了同样数目的黑色节点。

原文地址:https://www.cnblogs.com/zzqboy/p/8505580.html

时间: 2024-10-11 13:09:04

AVL变种-红黑树的相关文章

树:BST、AVL、红黑树、B树、B+树

我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到过. (2) 查找的时间复杂度大体维持在O(log(N))数量级上.可能有些结构在最差的情况下效率将

二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)的比较

http://www.iteye.com/topic/614070 此少侠总结的特棒,直接收藏了. 我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到

浅谈AVL树,红黑树,B树,B+树原理及应用

背景:这几天在看<高性能Mysql>,在看到创建高性能的索引,书上说mysql的存储引擎InnoDB采用的索引类型是B+Tree,那么,大家有没有产生这样一个疑问,对于数据索引,为什么要使用B+Tree这种数据结构,和其它树相比,它能体现的优点在哪里? 看完这篇文章你就会了解到这些数据结构的原理以及它们各自的应用场景. 二叉查找树 简介 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为

平衡二叉搜索树(AVL树,红黑树)数据结构和区别

平衡二叉搜索树(Balanced Binary Search Tree) 经典常见的自平衡的二叉搜索树(Self-balancing Binary Search Tree)有 ① AVL树 :Windows NT 内核中广泛使用 ② 红黑树:C++ STL(比如 map.set )Java 的 TreeMap.TreeSet.HashMap.HashSet  Linux 的进程调度  Ngix 的 timer 管理 1 AVL树  vs  红黑树 ①AVL树 平衡标准比较严格:每个左右子树的高度

数据结构之二叉树扩展AVL,B-,B+,红黑树

1.AVL 1.基本概念 AVL是平衡二叉查找树,它或者是一颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1. 若将二叉树结点上的平衡因子BF(Balance Factor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只能是-1,0,1. 2.性质 平衡二叉查找树,在添加或者删除的结点的过程中,如果失去平衡,则需要进行平衡调整.调整的过程中,要保持根大于左,小于右的特性. 3.应用场景 最早的平衡

红黑树、B(+)树、跳表、AVL等数据结构,应用场景及分析,以及一些英文缩写

在网上学习了一些材料. 这一篇:https://www.zhihu.com/question/30527705 AVL树:最早的平衡二叉树之一.应用相对其他数据结构比较少.windows对进程地址空间的管理用到了AVL树 红黑树:平衡二叉树,广泛用在C++的STL中.map和set都是用红黑树实现的.我们熟悉的STL的map容器底层是RBtree,当然指的不是unordered_map,后者是hash. B/B+树用在磁盘文件组织 数据索引和数据库索引 Trie树 字典树,用在统计和排序大量字符

AVL树、红黑树以及B树介绍

简介 首先,说一下在数据结构中为什么要引入树这种结构,在我们上篇文章中介绍的数组与链表中,可以发现,数组适合查询这种静态操作(O(1)),不合适删除与插入这种动态操作(O(n)),而链表则是适合删除与插入,而查询效率则就比较慢了,本文要分享学习的树就是为了平衡这种静态操作与动态操作的差距. 一.二叉查找树 简介 满足下面条件就是二叉查找树 任意节点左子树不为空,则左子树的值均小于根节点的值. 任意节点右子树不为空,则右子树的值均大于于根节点的值. 任意节点的左右子树也分别是二叉查找树. 没有键值

二叉树,平衡树,红黑树,B~/B+树汇总

二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到过. (2) 查找的时间复杂度大体维持在O(log(N))数量级上.可能有些结构在最差的情况下效率将会下降很快,比如二叉树 1.二叉查找树

红黑树分析,看了都说好

红黑树简介 红黑树是一种自平衡的二叉查找树,是一种高效的查找树.它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees).后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树.红黑树具有良好的效率,它可在 O(logN) 时间内完成查找.增加.删除等操作.因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap.C++