算法 红黑树

article/2025/10/1 4:02:43

红黑树

  • 红黑树概述
    • 红黑树性质
  • 红黑树的插入
  • 代码实现

红黑树概述

红黑树(Red Black Tree)是一种自平衡二叉查找树,是在计算机科学的中用到的一种数据结构,典型的用途是实现关联数组,红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能

它虽然是复杂到,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目

在这里插入图片描述

红黑树性质

红黑树是每个结点都带有颜色属性的二叉查找树,颜色是红色或黑色,在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  • 性质1 每个结点是红色或黑色
  • 性质2 根节点是黑色
  • 性质3 每个叶结点(NIL)是黑色
  • 性质4 每个红色结点的两个子结点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点)
  • 性质 5 从任一结点到其每个叶子的所有路径都包含相同数目的黑色节点

这些约束强制了红黑树的关键性质:从根到叶子的最长的可能路径不多与最短的可能路径的两倍长,结果是这个树大致是平衡的,因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成正比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树

是性质 3 导致路径上不能有两个连续的红色节点确保了这个结果,最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点,因为根据性质 4 所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长

红黑树的插入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

红黑树的左右单旋的代码与AVL树是一致的,根据上面的规则来实现红黑树的插入

typedef enum { RED = 0, BLACK = 1 }ColorType;typedef int KeyType;
typedef struct rb_node
{rb_node* leftchild;rb_node* parent;rb_node* rightchild;ColorType color; //AVL int balanceKeyType key;
}rb_node,*RBTree;rb_node* Buynode();
static rb_node* Nil = Buynode(); //哨兵节点rb_node* Buynode()
{rb_node* s = (rb_node*)malloc(sizeof(rb_node));if (s == nullptr) exit(1);memset(s, 0, sizeof(rb_node));s->rightchild = Nil;s->leftchild = Nil; //新节点左右孩子都指向哨兵s->color = RED;return s;
}
rb_node* MakeRoot(KeyType kx)    //建根
{rb_node* root = Buynode();root->color = BLACK;root->key = kx;return root;
}void RotateLeft(rb_node*& tree, rb_node* ptr)
{rb_node* newroot = ptr->rightchild;newroot->parent = ptr->parent;if (newroot->leftchild != nullptr){newroot->leftchild->parent = ptr;}ptr->rightchild = newroot->leftchild;newroot->leftchild = ptr;if (ptr == tree){tree = newroot;}else{if (ptr->parent->leftchild == ptr){ptr->parent->leftchild = newroot;}else{ptr->parent->rightchild = newroot;}}ptr->parent = newroot;
}
void RotateRight(rb_node*& tree, rb_node* ptr)
{rb_node* newroot = ptr->leftchild;newroot->parent = ptr->parent;ptr->leftchild = newroot->rightchild;if (newroot->rightchild != nullptr){newroot->rightchild->parent = ptr;}newroot->rightchild = ptr;if (ptr == tree){tree = newroot;}else{if (ptr->parent->leftchild == ptr){ptr->parent->leftchild = newroot;}else{ptr->parent->rightchild = newroot;}}ptr->parent = newroot;
}void PassRBTree(rb_node*& tree, rb_node* p)
{rb_node* _X = nullptr;for (; p != tree && p->parent->color == RED;){if (p->parent->parent->rightchild == p->parent) //is right{_X = p->parent->parent->leftchild;if (_X->color == RED){_X->color = BLACK;p->parent->color = BLACK;p->parent->parent->color = RED;p = p->parent->parent;}else{if (p->parent->leftchild == p) //我爹在双亲右边,我在双亲左边,是个折线{p = p->parent;RotateRight(tree, p); //先右单旋}p->parent->color = BLACK;p->parent->parent->color = RED;RotateLeft(tree, p->parent->parent); //左单旋转}}else{_X = p->parent->parent->rightchild;if (_X->color == RED){_X->color = BLACK;p->parent->color = BLACK;p->parent->parent->color = RED;p = p->parent->parent;}else{if (p->parent->rightchild == p) {p = p->parent;RotateLeft(tree, p);}p->parent->color = BLACK;p->parent->parent->color = RED;RotateRight(tree, p->parent->parent); }}}tree->color = BLACK;
}bool Insert(rb_node*& tree, KeyType kx)
{if (tree == nullptr){tree = MakeRoot(kx);return true;}rb_node* pa = nullptr;rb_node* p = tree;while (p != nullptr && p->key != kx){pa = p;p = kx < p->key ? p->leftchild : p->rightchild;}if (p != nullptr && p->key == kx) return false;p = Buynode();p->key = kx;p->parent = pa;if (kx < pa->key){pa->leftchild = p;}else{pa->rightchild = p;}PassRBTree(tree, p); //回溯return true;
}

http://chatgpt.dhexx.cn/article/mbNe2vYb.shtml

相关文章

【数据结构】--二叉树,红黑树

【数据结构】--二叉树&#xff0c;红黑树 &#x1f3c6;概念&#x1f34d;定义&#x1f34b; 术语&#x1f4dd;可视化网站 ☀️二叉树✨ 二叉搜索树&#x1f34d;定义&#x1f351;查找节点&#x1f34b;插入节点&#x1f345;遍历节点&#x1f355; 前序排序&#x1f9c0; 后…

红黑树的详细实现(C++)

红黑树概念(concept) 树型结构主要用于搜索&#xff0c;一直是科学领域的重要演算法&#xff0c;当中探讨了树可能遇到的问题&#xff1a;树的成长可能偏向于一边&#xff0c;也就是不平衡现象。 二叉树是常见且广泛使用的一种树&#xff0c;面临其可能退化成链表的潜藏缺点&…

二叉树——二叉查找树和红黑树

二叉树 二叉树&#xff0c;是一个非常重要的数据结构&#xff0c;在日常的开发中起着很重要的作用&#xff0c;它也衍生出来的各种高效的复杂的数据结构&#xff0c;为我们解决问题提供了高效的解决方案。 二叉树&#xff0c;它是由各个数据节点和左右链接构成的一种类似树的数…

Java——红黑树

概念 红黑树也是一种二叉搜索树&#xff0c;但是和avl树不同&#xff0c;它并不是依靠平衡因子来保证树的平衡的&#xff0c;而是通过颜色 红黑树每个节点中会存储颜色&#xff0c;分为红色和黑色&#xff0c;通过红黑树的限制条件&#xff0c;可以保证从根节点出发到叶子节点…

二叉树--红黑树

红黑树 定义 红黑树&#xff0c;顾名思义&#xff0c;就是树的节点只有红色和黑色两种状态&#xff0c;通过这两种状态的标识和规定颜色的使用&#xff0c;来使树达到相对平衡。为什么说相对平衡&#xff1f;因为在红黑树中&#xff0c;所有的条件限制只能保证&#xff0c;所…

二叉树之红黑树

红黑树 概述 为什么要有红黑树&#xff1f;&#xff1f;&#xff1f; 特点 红黑规则 如何在红黑树上添加节点&#xff1f; &#xff08;1&#xff09;我们不妨假设加入的节点都是黑色 &#xff08;2&#xff09;如果我们加入的节点都是红色 红黑树添加节点后如何保持红…

红黑二叉树

红黑树 红黑树是每个节点都带有颜色属性的二叉查找树&#xff0c;颜色或红色或黑色。在二叉查找树强制一般要求以外&#xff0c;对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色。 根节点是黑色。 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有…

红黑树-Java实现

目录 一、定义 二、插入 三、删除 四、全部代码 五、颜色效果 一、定义 红黑树是特殊的平衡二叉树&#xff0c;具有以下特性&#xff1a; 1、根节点的颜色是黑色 2、节点颜色要么是黑色、要么是红色 3、如果一个节点的颜色是红色&#xff0c;则它的子节点必须是黑色&…

红黑二叉树原理分析

1.引言 HashMap的基本结构是数组&#xff0c;链表和红黑树。以数组为基本形态&#xff0c;数组中的元素先以链表形式储存&#xff0c;当链表的长 度超过8时&#xff08;包含数组上的那个链表头&#xff09;就会将链表转换为红黑树&#xff0c;以加快修改和查询效率。当然除了H…

理解红黑树及代码实现

1.红黑树定义 红黑树是一颗 红-黑的平衡二叉树,它具有二叉树的所有特性,是一颗自平衡的排序二叉树.(树中任何节点值都大于左子节点的值&#xff0c;而且都小于右子节点的值),其检索效率高&#xff0c;它是一颗空树或它的左右两个子树高度差的绝对值不超过1&#xff0c;并且左右…

红黑二叉树的漫画讲解(轻松理解红黑二叉树原理)

———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树&#xff0c;就是…

Java的二叉树、红黑树、B+树

数组和链表是常用的数据结构&#xff0c;数组虽然查找快&#xff08;有序数组可以通过二分法查找&#xff09;&#xff0c;但是插入和删除是比较慢的&#xff1b;而链表&#xff0c;插入和删除很快&#xff08;只需要改变一些引用值&#xff09;&#xff0c;但是查找就很慢&…

二叉树与红黑树

二叉树的形成 二叉树是n(n>0)个结点的有限集合&#xff0c;该集合或者为空集&#xff08;称为空二叉树&#xff09;&#xff0c;或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成 二叉树特点 由二叉树定义以及图示分析得出二叉树有以下特点&#xff1…

红黑树(C++实现)

文章目录 红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的验证红黑树的查找红黑树的删除红黑树与AVL树的比较 红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个结点上增加了一个存储位用于表示结点的颜色&#xff0c;这个颜色可以是红色的&#xff0c;…

红黑二叉树详解及理论分析

发表于我的博客网站(prajna.top)&#xff1a; http://prajna.top/doc/2/175 什么是红-黑二叉树&#xff1f; 红-黑二叉树首先是一颗二叉树&#xff0c;它具有二叉树的所有性质&#xff0c;是一种平衡二叉树。普通二叉树在生成过程中&#xff0c;容易出现不平衡的现象&#xff…

二叉树到红黑树

二叉树查找树 又叫二叉排序树。二叉查找树或者是一棵空树&#xff0c;或者是一棵具有如下性质的二叉树&#xff1a; 对于任何一个结点X若它的左子树非空&#xff0c;则左子树上所有结点的值均小于等于X的值&#xff1b;若它的右子树非空&#xff0c;则右子树上所有结点的值均大…

详解c++---红黑二叉树的原理和实现

目录标题 什么是红黑二叉树树红黑树的性质红黑树的效率分析红黑树的准备工作红黑树的insert函数节点的调整情况一情况二情况三 转换的实现打印函数find函数检查函数 什么是红黑二叉树树 avl树是通过控制平衡因子来控制二叉搜索树的平衡&#xff0c;当某个节点的平衡因子等于2或…

红黑树和二叉树有什么区别?

红黑树和二叉树有什么区别&#xff1f; 什么是二叉树&#xff1f;什么是红黑树&#xff1f; 二叉树&#xff08;Binary Tree&#xff09;是指每个节点最多只有两个分支的树结构&#xff0c;即不存在分支大于 2 的节点&#xff0c;二叉树的数据结构如下图所示 这是一棵拥有 6 …

二叉树系列:红黑树

介绍 红黑树(Red-Black Tree&#xff0c;简称R-B Tree)&#xff0c;它一种特殊的二叉查找树。红黑树是特殊的二叉查找树&#xff0c;意味着它满足二叉查找树的特征&#xff1a;任意一个节点所包含的键值&#xff0c;大于等于左孩子的键值&#xff0c;小于等于右孩子的键值。除了…

红黑树结构原理的图文讲解(非代码)

1.引言 HashMap的基本结构是数组&#xff0c;链表和红黑树。以数组为基本形态&#xff0c;数组中的元素先以链表形式储存&#xff0c;当链表的长度超过8时&#xff08;包含数组上的那个链表头&#xff09;就会将链表转换为红黑树&#xff0c;以加快修改和查询效率。当然除了Ha…