数据结构之红黑树

xiaoxiao2021-02-28  97

红黑树性质:

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); }
转载请注明原文地址: https://www.6miu.com/read-41649.html

最新回复(0)