红黑树(RBTree)

这篇具有很好参考价值的文章主要介绍了红黑树(RBTree)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

性质1. 结点是红色或黑色。 

性质2. 根结点是黑色。 

性质3. 所有叶子都是黑色。(叶子是NIL结点) 

性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)

性质5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。 

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

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

因为红黑树是一种特化二叉查找树,所以红黑树上的只读操作与普通二叉查找树相同。 

结点设置和初始化:

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;
	KeyType key;
}rbnode;
typedef struct
{
	struct rb_node *root;
	struct rb_node* Nil;//哨兵结点
	int cursize;
}RBTree;
rb_node* Buynode(rb_node* parg, ColorType carg)
{
	rb_node* s = (rb_node*)calloc(1,sizeof(rb_node));
	if (s == nullptr)exit(1);
	s->color = carg;
	s->parent = parg;
	return s;
}
void Freenode(rb_node* p)
{
	free(p);
}
void InitRBTree(RBTree* ptree)
{
	assert(ptree != nullptr);
	ptree->Nil = Buynode(nullptr, BLACK);
	ptree->root = ptree->Nil;
	ptree->cursize = 0;
}

插入

插入过程首先是根据一般二叉查找树的插入步骤, 把新结点 插入到 某个叶结点的位置上,然后将 新节点着为红色。 为了保证红黑树的性质能继续保持,再对有关结点重点着色并旋转,其插入算法如下: 

1 按二叉查找树的插入步骤将结点新节点插入到 树tree中;

2 如果前面没有节点,则置为根节点(结束);

3 找到插入的位置,判断是双亲结点的左孩子还是右孩子;

4 从插入节点开始回溯,调整红黑树的结构使其满足上述五个性质;
 文章来源地址https://www.toymoban.com/news/detail-450377.html


bool Insert(rb_node*& tree, KeyType kx)
{
	assert(tree!= nullptr);
	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;
}
void PassRBTree(rb_node*& tree, rb_node* p)//左旋右旋函数与AVL树相同
{
	rb_node* _X = nullptr;
	for (; p != tree && p->parent->color == RED;)
	{
		if (p->parent->parent->rightchild == p->parent)	 // ringht
		{
			_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;
}

到了这里,关于红黑树(RBTree)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树、二叉查找树、平衡树和红黑树概念及其性质

      在所有的树结构,基本上都遵循左小右大的原则。本文分享二叉树、二叉查找树、平衡树和红黑树概念及其性质。   二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构(即不存在分支大于 2 的节点),如下图所示:   这是一棵拥有 6 个节点深度为 2(深度

    2024年02月08日
    浏览(39)
  • 【C++高阶(四)】红黑树深度剖析--手撕红黑树!

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 如果说发明AVL树的人是天才,那么 发明红黑树的人可以称为天才中的 精英!为什么AVL树这么强大但是没啥 人用呢?就是因为红黑树比你还好

    2024年02月05日
    浏览(46)
  • 搜索二叉树 | 红黑树 | 验证是否为红黑树 | 代码实现

    黑红树是一颗特殊的搜索二叉树,本文在前文的基础上,图解红黑树插入:前文 链接,完整对部分关键代码展示,完整的代码在gitee仓库中: 链接 文章中有错误的地方,欢迎大家指正!如果有帮助到你,也请多多点赞支持! 1.红黑树的概述 平衡二叉树要求左右子树的高度差

    2024年02月21日
    浏览(41)
  • AVL树,红黑树,红黑树封装map和set

    二叉搜索树虽可以缩短查找的效率,但如果 数据有序或接近有序二叉搜索树将退化为单支树 ,查找元素相当于在顺序表中搜索元素, 效率低下 。因此,咱们中国的邻居俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法: 当向二叉搜索树中插入

    2023年04月25日
    浏览(62)
  • 【C++进阶06】红黑树图文详解及C++模拟实现红黑树

    1.1 红黑树的概念 AVL树用平衡因子让树达到高度平衡 红黑树可以认为是AVL树的改良 通过给每个节点标记颜色让树接近平衡 以减少树在插入节点的旋转 在每个结点新增一个存储位表示结点颜色 可以是Red或Black 通过对任何一条从根到叶子的路径上 各个结点着色方式的限制 红黑

    2024年01月21日
    浏览(49)
  • 红黑树是什么,为什么HashMap使用红黑树代替数组+链表?

            我们都知道在HashMap中,当数组长度大于64并且链表长度大于8时,HashMap会从数组+链表的结构转换成红黑树,那为什么要转换成红黑树呢,或者为什么不一开始就使用红黑树呢?接下来我们将去具体的去剖析一下!         红黑树是一种自平衡的二叉搜索树,它是

    2024年04月14日
    浏览(37)
  • 【C++进阶5-红黑树】噩梦般的存在?手提AVLTree暴揍红黑树!

    今天,带来无数人的噩梦——红黑树的讲解。文中不足错漏之处望请斧正! 如果还没看过AVLTree讲解的一定要去看看,看完才能更好理解红黑树! 红黑树是自平衡的二叉搜索树。 红黑树的规则: 每个结点非黑即红 根结点为黑 叶子结点为黑(此处的叶子结点指空结点) 不能有

    2024年02月07日
    浏览(45)
  • 史上最详细的红黑树讲解(一篇文章教你手撕红黑树)

           🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️博客专栏:✈️数据结构与算法       🛰️欢迎关注:👍点赞🙌收藏✍️留言       今天给大家讲解红黑树,和AVL树一样,这章暂且不讲删除。

    2024年01月16日
    浏览(42)
  • 什么是红黑树

    红黑树     红黑树是有序的,Hash是无序的,根据需求来选择。 红黑树占用的内存更小(仅需要为其存在的节点分配内存),而Hash事先应该分配足够的内存存储散列表,即使有些槽可能弃用 红黑树查找和删除的时间复杂度都是O(logn),Hash查找和删除的时间复杂度都是O(1)。 当哈

    2024年02月08日
    浏览(33)
  • 红黑树——原理刨析

            众所周知,红黑树是从AVLTree树中衍变而来的,所以在学红黑树之前还是要好好的理解一下AVLTree树的原理,为理解红黑树减轻理解负担,好了进入正题。         由名可知,红黑树——肯定是与颜色有关的一个树,又因为是从AVLTree树中衍化过来的,所以也是搜索树(

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包