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