数据结构之红黑树

本文介绍了红黑树的基本性质,包括颜色属性、路径黑色节点数量等,并详细说明了如何根据这些性质检测一棵树是否为红黑树。通过具体算法实现,确保红黑树的平衡特性。

红黑树性质:

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值