数据结构之红黑树

来源:互联网 发布:nginx 去除版本号 编辑:程序博客网 时间:2024/05/17 06:49

红黑树性质:

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);    }