理解红黑树

红黑树是一种自平衡二叉查找树,用于高效地插入、删除和查找操作。在CFS进程调度、内存管理和map等场景下广泛应用。其特性包括每个节点要么是红要么是黑,根节点为黑,黑色节点平衡分布。节点插入可能导致颜色失衡,通过旋转和颜色调整保持平衡。右旋步骤中,y的左子树变为x的右子树,x的父节点指向y的父节点。红黑树的插入修复确保了树的平衡性,提高查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红黑树

用途及特性

特性

1 主要通过 KEY VAULE 来查找。
2 中序遍历是顺序的

用途

  • cfs 进程调度系统。有序,查找高效。

  • 内存管理 内存的方式有二种,首地址作为KEY , 长度作为VALUE
    每malloc一次,往红黑树中添加一个节点。 另一种起始和结束地址

  • map

  • nginx

  • 定时器

性质

  • 每一个节点是黑或者是红
  • 根节点是黑色的
  • 叶子节点是黑色的
  • 如果有一个节点是红色的,那么它的二个儿子节点是黑色的。 代表着相邻的节点颜色是不一样的。
  • 对每一个节点,从该节点到其子孙节点的所有路径上,包含相同数目的黑节点。 意味着黑色节点是平衡的。

红黑树旋转

在这里插入图片描述

右旋步骤
  • y的左子树b, 变成x的右子树
  • y的左子树,指向x
  • x的父节点,指向 y的父节点
节点插入,涉及到颜色的修正

插入的节点为 z; 插入的状态,仅为三种。
y是红色

在这里插入图片描述
y是黑色
y->cllor == black
在这里插入图片描述


void rbtree_insert_fixup(rbtree *T, rbtree_node *z) {

	while (z->parent->color == RED) { //z ---> RED
		if (z->parent == z->parent->parent->left) {
			rbtree_node *y = z->parent->parent->right;
			if (y->color == RED) {
				z->parent->color = BLACK;
				y->color = BLACK;
				z->parent->parent->color = RED;

				z = z->parent->parent; //z --> RED
			} else {

				if (z == z->parent->right) {
					z = z->parent;
					rbtree_left_rotate(T, z);
				}

				z->parent->color = BLACK;
				z->parent->parent->color = RED;
				rbtree_right_rotate(T, z->parent->parent);
			}
		}else {
			rbtree_node *y = z->parent->parent->left;
			if (y->color == RED) {
				z->parent->color = BLACK;
				y->color = BLACK;
				z->parent->parent->color = RED;

				z = z->parent->parent; //z --> RED
			} else {
				if (z == z->parent->left) {
					z = z->parent;
					rbtree_right_rotate(T, z);
				}

				z->parent->color = BLACK;
				z->parent->parent->color = RED;
				rbtree_left_rotate(T, z->parent->parent);
			}
		}
		
	}

	T->root->color = BLACK;
}

思考真实场景红黑树应用

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值