2-3 树/红黑树(red-black tree)

2-3 tree

2-3树节点

  1. null节点,null节点到根节点的距离都是相同的,所以2-3数是平衡树
  2. 2叉节点,有两个分树,节点中有一个元素,左树元素更小,右树元素节点更大
  3. 3叉节点,有三个子树,节点中有两个元素,左树元素更小,右树元素更大,中间树介于两个父元素之间。

    插入操作如下图所示

红黑树

红黑树可以理解为实现了2-3树的BST(binary search tree),它是一个自平衡树,保证在最坏的情况下的操作也是O(lg(n))

特性:

  1. 每个节点有一个颜色属性(红或黑)
  2. 根节点是黑色的
  3. 所有的null节点都是黑色的,从任何null节点到根节点所经过的黑色节点数目相同

查找操作与BST是相同的

插入规则如下:

  • 按BST的插入方法在null节点上建立新节点,新节点的颜色为红色
  • 如果有右子节点为红色,则左旋,右子节点变为父节点
  • 如果左子节点与左孙节点都为红色,则进行右旋,左字节的变为父节点
  • 如果两个节点的颜色都为红色,则翻转反色

操作流程如下图所示:

  • 图左为插入节点c,先标记为红,因为a、c都为红节点,故颜色反转
  • 中间插入节点a,由于插入后a、b节点都为红色,按第3条规则需要进行右旋操作,b变成了新的父节点
  • 图右插入节点b,由于b在a的右边,故先进行左旋,然后又发现a、b同为红色,再进行右旋

左旋:

左图为左旋前,右图为左旋后,代码如下所示:

private Node rotateRight(Node h){
    assert isRed(h.right);
    Node x = h.right;       // 复制h的 右子树 为节点x
    h.right = x.left;       // 将x的左子树移动到h的右节点上(替代)
    x.left = h;             // 将修改后的h节点作为x的左节点(替代)
    x.color = h.color;      // x继承h的颜色
    h.color = RED;          // 将h节点的颜色设置为红色
    return x;               // 返回x节点作为新的父节点
}

右旋操作与之类似

颜色反转:

左图为颜色翻转前,右图为操作之后,代码如下所示:

private void flipColors(Node h){
    assert !isRed(h);
    assert isRed(h.left);
    assert isRed(h.right);
    h.color = RED;              // 将父节点颜色改为红色
    h.left.color = BLACK;       // 将左右子节点颜色改为黑色,
    h.right.color = BLACK;
}

此处只实现了查找与插入,如要完整实现所有功能(还有删除),可以采用左倾红黑树(LLRB, Left-leaning red–black tree)

红黑树显示的demo



Reference

  1. wikipedia Red–black tree

原文地址:https://www.cnblogs.com/fugeny/p/9692300.html

时间: 2024-10-09 18:34:52

2-3 树/红黑树(red-black tree)的相关文章

树-红黑树(R-B Tree)

红黑树概念 特殊的二叉查找树,每个节点上都有存储位表示节点的颜色是红(Red)或黑(Black).时间复杂度是O(lgn),效率高. 特性: (1)每个节点或者是黑色,或者是红色. (2)根节点是黑色. (3)每个叶子节点(NIL)是黑色.(只为空(NIL或null)的节点) (4)如果一个节点是红色的,则它的子节点必须是黑色的.(黑结点可连续,红结点不能连续) (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点. 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).

笔试算法题(51):简介 - 红黑树(RedBlack Tree)

红黑树(Red-Black Tree) 红黑树是一种BST,但是每个节点上增加一个存储位表示该节点的颜色(R或者B):通过对任何一条从root到leaf的路径上节点着色方式的显示,红黑树确保所有路径的差值不会超过一倍,最终使得BST接近平衡: 红黑树内每个节点包含五个属性:color, key, left, right和p,p表示指向父亲节点的指针:一棵BST需要同时满足下述五个性质才能称作红黑树: 每个节点只能是红色或者黑色节点中的一种: 根节点必须是黑色: 每个叶节点(NULL)必须是黑色:

浅谈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树 平衡标准比较严格:每个左右子树的高度

查找二,二叉树查找与2-3树红黑树

BST: 每个节点的键,都大于其左自述中的任意节点的键,而小于有字数的任意结点的键. 部分实现 get(Node x , Key key){ if(x == null) return null; cmp = key.compareTo(x.key); if(cmp<0) retrun get(x.right,key); else if(cmp>0) retrun get(x.left,key); else return x.val; } 2-3树红黑树: 属于平衡查找树,为了希望保持二分查找树

数据结构--树--红黑树

R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树.红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black). 红黑树的特性:(1)每个节点或者是黑色,或者是红色.(2)根节点是黑色.(3)每个叶子节点(NIL)是黑色. [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的.(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点.

树/二叉树(哈夫曼树/红黑树)笔记

1.树是一种常用数据结构,它是非线性结构. 2.树中任一普通节点可以有0或者多个子节点,但只能有一个父节点. 根节点没有父节点, 叶子节点没有子节点. 3.二叉树: 1)每个节点最多只能有两个子树的有序树 2)左边的子树称为左子树 3)右边的子树成为右子树 4)一棵深度为k的二叉树,如果它包含了(2^k-1)个节点,就把这棵二叉树称为满二叉树 4.满二叉树的特点: 1)每一层上的节点数都是最大节点数,即各层为1,2,4,8,16 .... (2^k-1) 2)一棵有n个节点的二叉树,按满二叉树的

数据结构学习笔记-排序/队/栈/链/堆/查找树/红黑树

排序: 插入排序:每次从剩余数据中选取一个最小的,插入已经排序完成的序列中 合并排序:将数据分成左右两组分别排序,然后合并,对每组数据的排序递归处理. 冒泡排序:重复交换两个相邻元素,从a[1]开始向a[0]方向冒泡,然后a[2]...当a[i]无法继续往前挤的时候说明前面的更小了,而且越往前越小(挤得越往前) 堆排序:构造最大堆,每次取走根结点(自然是最大的),再调用MAX-HEAPIFY算法(见后文的堆)恢复最大堆的性质,重复取走根结点 快速排序(对A[r]-A[n]进行排序): 1.从序列

伸展树&amp;红黑树&amp;AVL树总结

最近学习了这3种树,感觉其实有很多相同的地方吧,首先是最重要的旋转操作,3种树都有 AvlTree left_left(AvlTree k1) { //if(height(k1->left)-height(k1->right)<2)return k1; AvlTree k2 = k1->left; k1->left = k2->right; k2->right = k1; k1->Height = max(height(k1->left),height