给定一个红黑树,我需要编写一个有效的算法来检查每个节点是否从节点到后代叶子的所有路径都包含相同数量的黑色节点,即如果属性为真,算法应该返回一个布尔值否则为假。
问问题
5265 次
2 回答
1
它将返回 RB 树的黑色高度。如果高度为 0,则树是无效的红黑树。
int BlackHeight(NodePtr root)
{
if (root == NULL)
return 1;
int leftBlackHeight = BlackHeight(root->left);
if (leftBlackHeight == 0)
return leftBlackHeight;
int rightBlackHeight = BlackHeight(root->right);
if (rightBlackHeight == 0)
return rightBlackHeight;
if (leftBlackHeight != rightBlackHeight)
return 0;
else
return leftBlackHeight + root->IsBlack() ? 1 : 0;
}
于 2012-12-12T21:36:01.897 回答
0
下面的代码验证任何路径上的黑色节点数是否相同
#define RED 0
#define BLACK 1
struct rbt {
int data;
struct rbt *left;
struct rbt *right;
int parent_color; // parent link color
uint64_t nodes_count; // to store number of nodes present including self
int level; // to store level of each node
};
typedef struct rbt rbt_t;
int check_rbt_black_height(rbt_t *root)
{
if(!root) return 1;
else {
int left_height = check_black_violation(root->left);
int right_height = check_black_violation(root->right);
if (left_height && right_height && left_height != right_height) {
printf("Error: Black nodes are not same @level=%d\n", root->level);
exit(1);
}
if (left_height && right_height)
// do not increment count for red
return is_color_red(root) ? left_height : left_height + 1;
else
return 0;
}
}
int is_color_red(rbt_t *root)
{
if(root && root->parent_color == RED) return 1;
return 0;
}
于 2013-11-13T06:28:03.140 回答