红黑树性质:
1、每个节点不是红的就是黑的
2、没有连续的红节点
3、根节点为黑色的
4、每条路径上黑色节点的数量都相等
5、每个叶子节点的空指针域都是黑色的
通过以上要求,可以保证最长路径上节点数不超过最短路径节点数的两倍
(极限情况下),又因为每插入几个元素,就要调整一次红黑树,
则它是一种近似平衡的二叉树
检测红黑树:
检测一棵树是不是红黑树,就要根据它的性质来检测,红黑树种有两条很重要的性质,就是性质三(没有两个连在一起的红色节点)和性质四(每条路上的黑色结点个数相等)。
要判断每条路上的黑色结点个数是否相等,首先就要知道其他路上的个数是多少,那么可以先计算出到达最左结点时,黑色结点的个数,再根据这个值来判断其他路上的值是不是和这个值相等,如果不相等则返回false,否则继续判断。
bool CheckRBTree(Node* root)
{
Node* pRoot = root;
size_t k = 0;
if(pRoot == NULL)
return true;
size_t blackCount = 0;
while(pRoot->_Left)
{
if(pRoot->_color == BLACK)
++blackCount;
pRoot = pRoot->_Left;
}
return _CheckRBTree(root, blackCount, k);
}
bool _CheckRBTree(Node* pRoot, const size_t blackCount, size_t k)
{
if(pRoot == NULL)
return true;
else
{
Node* pParent = pRoot->_Parent;
if(pRoot->_color == RED && pParent->_color == RED)
return false;
if(pRoot->_color == BLACK)
{
k++;
}
if(pRoot->_Left == NULL && pRoot->_Right == NULL)
{
if(k != blackCount)
return false;
return true;
}
}
return _CheckRBTree(pRoot->_Left, blackCount, k) && _CheckRBTree(pRoot->_Right, blackCount, k);
}