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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/han8040laixin/article/details/82818470

红黑树属于二叉搜索树,但是每个节点增加了一个存颜色的位,它的规则是:
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一样,再判断左子树和右子树
	}

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/82818470