二叉树学习四:红黑树(参考维基百科)

  1.红黑树描述:它或是一颗空树,或是具有下面属性的二叉搜索树:

  1)节点非红即黑;
  2)根节点是黑色;
  3)所有NULL结点称为叶子节点,且认为颜色为黑 ;
  4)所有红节点的子节点都为黑色;
  5)从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

  插入和删除操作时间可以保持为 O(log n) 次,图1(本文图来自维基百科)是一个具体的红黑树:

图1:红黑树

  2.红黑树插入:假设插入节点为红,根据邻近结点的颜色进行具体调整:

  1)为空树,直接插入,把颜色变换为黑;

  2)插入结点的父结点为黑,直接插入,不做调整;

  3)插入结点父结点和叔父结点都为红,则把他们两个重设置为黑,设置其祖父结点为红,设置过程如图2。以递归的方式检验整个树。

  

图2:父叔结点都为红的处理过程

  4)父节点是红色而叔父节点是黑色或缺少,新节点是其父节点的左子节点,而父节点又是祖父节点的左子节点。进行针对祖父节点的一次右旋转,在旋转产生的树中,以前的父节点现在是新节点和以前的祖父节点的父节点,如图3所示。

图3:父红叔为黑或缺少,父为祖父左子树处理

  5)父节点是红色而叔父节点是黑色或缺少,新节点是其父节点的右子节点而父节点又是祖父节点的左子节点。进行一次左旋转调换新节点和其父节点的角色,然后按照4)进行处理。

图4:父红叔为黑或缺少,父为祖父左子树处理

  3.红黑树删除:

  1)删除是新的根,直接操作。

  2)S是红色,在N的父亲上做左旋转,把红色兄弟转换成N的祖父,我们接着对调N的父亲和祖父的颜色。

图5:S是红的处理

  3)N的父亲、S和S的儿子都是黑色的。在这种情形下,我们简单的重绘S为红色。结果是通过S的所有路径,它们就是以前通过N的那些路径,都少了一个黑色节点。

图6:N的父亲、S和S的儿子都是黑色的处理

  4)S和S的儿子都是黑色,但是N的父亲是红色。在这种情形下,我们简单的交换N的兄弟和父亲的颜色。

图7:S和S的儿子都是黑色,N的父亲是红色处理

  5)S是黑色,S的左儿子是红色,S的右儿子是黑色,而N是它父亲的左儿子。在这种情形下我们在S上做右旋转,这样S的左儿子成为S的父亲和N的新兄弟。我们接着交换S和它的新父亲的颜色。

图8:S是黑色,S的左儿子是红色,S的右儿子是黑色,而N是它父亲的左儿子处理

  6)S是黑色,S的右儿子是红色,而N是它父亲的左儿子。在这种情形下我们在N的父亲上做左旋转,这样S成为N的父亲(P)和S的右儿子的父亲。

图9:S是黑色,S的右儿子是红色,而N是它父亲的左儿子

时间: 2024-10-08 18:13:23

二叉树学习四:红黑树(参考维基百科)的相关文章

马程序员学习笔记——红黑树解析四

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 本篇是将上面三篇的理论知识转化成代码,java实现 首先,看一下算法导论里的伪代码 一.左旋 The pseudocode for LEFT-ROTATE assumes that right[x] ≠ nil[T] and that the root's parent is nil[T].(伪代码的左旋方法中假设X的右孩子不为空) LEFT-

马程序员学习笔记——红黑树解析三

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历:

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

木马程序猿学习笔记——红黑树解析3

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.訪问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.訪问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.訪问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历:

算法导论第十三章 红黑树

写在前面:这一章真的把我害惨了,之前至少尝试看过3遍,每次看之前都下定决定一定要把它拿下,可是由于内容较多,深度够深,以致于每次要不是中途有什么事放弃了就跳过了,要不是花时间太多仍然不能理解而放弃.这次总算挺过来了,前后零零散散的时间加起来差不多也有两天时间.这次能坚持下来并攻克,我想大概有这么几个原因吧:第一是之前下定的决心要写一个最新版<算法导论>的读书笔记,之前几章都坚持写了,不能让这个成为拦路虎,即使再难再花时间都要弄懂:第二是通过前面几章的动手实践,发现自己的理解能力.动手能力都进步

JDK源码那些事儿之红黑树基础上篇

说到HashMap,就一定要说到红黑树,红黑树作为一种自平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能,今天就来说一说红黑树. 前言 限于篇幅,本文只对红黑树的基础进行说明,暂不涉及源码部分,大部分摘抄自维基百科,这里也贴出对应链接: 维基百科(中文):https://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91 维基百科:https://en.wikipedia.org/wiki/Red%E2%

手撸红黑树-Red-Black Tree 入门

一.学习红黑树前的准备: 熟悉基础数据结构 了解二叉树概念 二.红黑树的规则和规则分析: 根节点是黑色的 所有叶子节点(Null)是黑色的,一般会认定节点下空节点全部为黑色 如果节点为红色,那么子节点全部为黑色 从某一节点出发,到达叶子节点的所有分支上,黑色节点的数量相同 由规则4引出的一个定义,从根节点到叶子节点的黑色节点数量成为 树的黑色高度.我们会发现由于红色节点下全部为黑色节点,那么最极端的情况就是,根节点出发,左子树全部为黑色节点,右子树为红色-黑色轮换,这样设想下不难发现,树的最长路

漫画:什么是红黑树?

要理解红黑数,先要了解二叉查找树,二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值. 2.右子树上所有结点的值均大于或等于它的根结点的值. 3.左.右子树也分别为二叉排序树. 下图中这棵树,就是一颗典型的二叉查找树: 1.查看根节点9: 2.由于10 > 9,因此查看右孩子13: 3.由于10 < 13,因此查看左孩子11: 4.由于10 < 11,因此查看左孩子10,发现10正是要查找的节点: 二叉查找树的缺陷 假设初始的二叉查找树只有三个节点,

java中treemap和treeset实现(红黑树)

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializab