红黑树旋转的通俗易懂版本以及判断一个树是否为红黑树

红黑树属于二叉搜索树,但是每个节点增加了一个存颜色的位,它的规则是:
1.根节点为黑色。
2.不能有连续的两个红节点,所以如果一个节点的颜色为红,那么它的子节点若不为空则一定为红。
3.每条路径上黑节点数量相同。
所以保证了最长路径不超过最短路径的两倍,没有AVL树那么严格的平衡,但是旋转少效率高,也是O(LgN)。

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

判断一棵树是否为红黑树:

	bool IsRB()
	{
		if (_root != NULL && _root->_col == RED)//根为红则不是红黑树
			return false;

		int CurBlackNum = 0;//用来记录每路的黑节点个数

		int BlackNum = 0;//先统计出一条路径的黑色节点的个数
		Node* cur = _root;
		while (cur)
		{
			if (cur->_col == BLACK)
				BlackNum++;
			cur = cur->_left;
		}

		return _IsRB(_root, BlackNum, CurBlackNum);
	}

	bool _IsRB(Node* root, int BlackNum, int CurBlackNum)
	{
		if (root == NULL)
			return true;

		if (root->_col == RED && root->_parent->_col == RED)//两个连续的红节点则不为红黑树
			return false;

		if (root->_col == BLACK)//黑节点就将CurBlackNum++
			CurBlackNum++;

		if (root->_left == NULL && root->_right == NULL)
		{
			if (CurBlackNum == BlackNum)
				return true;
			else//黑色节点不相等返回false
				return false;
		}

		return _IsRB(root->_left, BlackNum, CurBlackNum)
			&& _IsRB(root->_right, BlackNum, CurBlackNum);//和AVL一样,再判断左子树和右子树
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值