C++ -- 红黑树的插入

1. 概念

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。

2. 性质

  1. 节点的颜色只能是黑色或红色
  2. 没有连续的红色节点,红色节点的孩子一定是黑色
  3. 根节点是黑色的
  4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色节点
  5. 每个空节点都是黑色的

3. 节点的定义

enum Colour
{
	RED,
	BLACK
};

template<class T>
struct RBTreeNode
{
	RBTreeNode<T>* _pLeft;
	RBTreeNode<T>* _pRight;
	RBTreeNode<T>* _pParent;
	T _data;
	Colour _col;

	RBTreeNode(const T& data)
		: _pLeft(nullptr)
		, _pRight(nullptr)
		, _pParent(nullptr)
		, _data(data)
	{}
};

4. 插入

按照二叉搜索树规则插入
重点解释调节过程
默认插入的新节点为红色,约定插入的节点为cur,p为父节点,g为祖父节点,u为叔叔节点。

  1. 情况一: cur为红,p为红,g为黑,u存在且为红
    将p和u变为黑的
    g如果是根节点就不变色;如果不是根节点就变红,并视为新的cur继续向上调整
    在这里插入图片描述

  2. 情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑
    如果u不存在,则cur为新插入节点
    在这里插入图片描述

    如果u存在,其一定为黑。cur原先一定为黑,因为子树的调整导致其变红。
    在这里插入图片描述

  3. 情况三: cur为红,p为红,g为黑,u不存在/u存在且为黑
    与情况二不同的是cur和p以及p和g的位置关系
    情况三会发生双旋情况:
    在这里插入图片描述
    在这里插入图片描述

5. 红黑树检验

检验一棵树是否满足红黑树分为两步:

  1. 检测其是否满足二叉搜索树(中序遍历是否为有序序列)
  2. 检测其是否满足红黑树的性质
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值