再论红黑树

红黑树:

红黑树(Red Black Tree) 是一种自平衡二叉查找树 :

l 每个节点或者是黑色,或者是红色。

l 根节点是黑色。

l 每个叶子节点是黑色。

l 如果一个节点是红色的,则它的子节点必须是黑色的。

l 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

红黑树的各种操作的时间复杂度是O(log2N)。

红黑树 vs AVL

红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完爆avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多

插入操作

红父
     如果新节点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如下图所示,由于父结点为红色,此时可以判定,祖父结点必定为黑色。这时需要根据叔父结点的颜色来决定做什么样的操作。青色结点表示颜色未知。由于有可能需要根结点到新点的路径上进行多次旋转操作,而每次进行不平衡判断的起始点(我们可将其视为新点)都不一样。所以我们在此使用一个蓝色箭头指向这个起始点,并称之为判定点。

l 红叔
当叔父结点为红色时,如下图所示,无需进行旋转操作,只要将父和叔结点变为黑色,将祖父结点变为红色即可。但由于祖父结点的父结点有可能为红色,从而违反红黑树性质。此时必须将祖父结点作为新的判定点继续向上(迭代)进行平衡操作。

需要注意的是,无论“父节点”在“叔节点”的左边还是右边,无论“新节点”是“父节点”的左孩子还是右孩子,它们的操作都是完全一样的(其实这种情况包括4种,只需调整颜色,不需要旋转树形)。

l 黑叔
当叔父结点为黑色时,需要进行旋转,以下图示了所有的旋转可能:
Case 1:

Case 2:

Case 3:

Case 4:

原文地址:https://www.cnblogs.com/misscai/p/9595490.html

时间: 2024-10-13 21:15:34

再论红黑树的相关文章

从二叉排序树到平衡二叉树再到红黑树系列3

这篇博客主要讲解B树及其插入删除操作,并给出操作的流程图以达到清晰易懂的目的,尽管标题是从二叉排序树到平衡二叉树再到红黑树系列3,没有B树二字,但他们都是动态查找树,所以我将他们归为一个系列. B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树.它以一种很自然的方式推广了二叉搜索树,B树与红黑树的不同之处在于B树结点的孩子不限于最多为2,而是可以有数个到数千个不定.因为结点的分支更多,因而相比红黑树,高度更小. B树的定义有如下两种,但殊途同归. 定义形式一(以度 t 定义): 一棵

从二叉排序树到平衡二叉树再到红黑树系列1

最近想写一些关于红黑树的博客,既想写的全面,又直观,但是又不知道从哪里入手.斟酌再三,还是从最简单的二叉排序树开始写. 二叉排序树(Binary Sort Tree)又叫二叉查找树.它是一种特殊结构的二叉树.其或为空树,或具备下列性质: (1)若它的左子树不为空,则左子树上所有结点的值均小于它的根节点的值. (2)若它的右子树不为空,则左子树上所有结点的值均大于它的根节点的值. 显然,它的中序遍历就是一个递增的有序序列. 定理:在一棵高度为h的二叉搜索树上,动态集合上的操作serach,minm

从二叉排序树到平衡二叉树再到红黑树系列2

上篇博客主要讲述了二叉排序树的基本概念和插入删除操作,必须再次说明的是:在一棵高度为h的二叉排序树上,实现动态集合操作查询,插入和删除的运行时间均为O(h). 可见二叉树的基本操作效率取决于树的形态,当然树的高度越低越好,显然树分布越均匀,高度越低.那么,问题来了?对于给定的关键字序列,如何构造一棵形态匀称的二叉排序树.这种匀称的二叉排序树就称为平衡二叉树. 平衡二叉树定义:平衡二叉树或为空树,或其上任意一个节点,节点的左右子树高度差不超过1.     通常将二叉树上所有结点的左右子树的高度之差

从二叉树到2-3-4树再到红黑树

直接进入正题: 一.如何从数组生成一个二叉树 假设数组为:{ 30, 13, 7, 43, 23, 12, 9, 33, 42, 21, 18, 6, 3, 50 },我们不对数组排序,直接生成二叉树. 创建流程: 1.将第一数作为根节点: 2.插入13,13小于30,放在30的左边子节点. 3.插入7,7小于30,7小于13,放在13的左边子节点. 4.插入43,43大于30,放在30的右边子节点. 5.放入23,23小于30,23大于13,放入13的右边子节点. 6.放入12,12小于30,

红黑树的删除操作详解

注:本文转载自博客园,博主原址:http://www.cnblogs.com/tongy0/p/5460623.html,感谢博主帮我弄清楚了红黑树删除操作,转载做收藏用. 红黑树的删除操作 1:节点命名约定 D表示要被删除的节点.即:取 Delete 的首字母: P 表示父节点.即:取 Parent 的首字母: S表示兄弟姐妹节点.即:取 Sibling的首字母: U表示叔伯节点.即:取Uncle的首字母: G表示祖父节点.即:取 Grandfather的首字母: L表示左树.即:取Left的

红黑树之添加节点和创建

红黑树之插入节点 红黑树的性质 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色. 根节点是黑色. 每个叶节点(这里的叶节点是指NULL节点,在<算法导论>中这个节点叫哨兵节点,除了颜色属性外,其他属性值都为任意.为了和以前的叶子节点做区分,原来的叶子节点还叫叶子节点,这个节点就叫他NULL节点吧)是黑色的. 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的

为什么红黑树的效率比较高

红黑树属于平衡二叉树.它不严格是因为它不是严格控制左.右子树高度或节点数之差小于等于1,但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n). 红黑树(red-black tree) 是一棵满足下述性质的二叉查找树: 1. 每一个结点要么是红色,要么是黑色. 2. 根结点是黑色的. 3. 所有叶子结点都是黑色的(实际上都是Null指针,下图用NIL表示).叶子结点不包含任何关键字信息,所有查询关键字都在非终结点上. 4. 每个红色结点的两个子节点必须是黑色的.换句话说:从每个

红黑树探索笔记

最近花了些时间重拾数据结构的基础知识,先尝试了红黑树,花了大半个月的时间研究其原理和实现,下面是学习到的知识和一些笔记的分享.望各位多多指教.本次代码的实现请点击:红黑树实现代码 红黑树基础知识 定义 红黑树是带有color属性的二叉搜索树,color的值为红色或黑色,因此叫做红黑树. 对红黑树的每个结点的结构体定义如下: struct RBNode { int color; void *key; void *value; struct RBNode *left; struct RBNode *

为什么要有红黑树?什么是红黑树?画了20张图,看完这篇你就明白了

为什么要有红黑树 想必大家对二叉树搜索树都不陌生,首先看一下二叉搜索树的定义: 二叉搜索树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 从理论上来说,二叉搜索树的查询.插入和删除一个节点的时间复杂度均为O(log(n)),已经完全可以满足我们的要求了,那么为什么还要有红黑树呢? 我们来看一个例