【发布时间】:2018-05-15 20:11:05
【问题描述】:
我终于想出了如何成功地将项目插入到我的红黑树中而不会出现任何分段错误,但是,我的节点着色已关闭。
我正在尝试按以下顺序将以下值插入到树中:4 3 2 6 5 1
当我打印出 InOrder 树时,我得到以下信息:1-R 2-B 3-B
4-R 5-R 6-B
什么时候我应该得到:1-R 2-B 3-B 4-R 5-B 6-R
这是我的InsertFixUp 函数:
void RBTree::RBInsertFixUp(RBNode* z){
RBNode* y;
if(z == RBTree::root){
root->color = 'B';
}else{
while(z->parent->color == 'R'){
if(z->parent == z->parent->parent->left){
y = z->parent->parent->right;
if(y->color == 'R'){
z->parent->color = 'B'; //Case 1 Check
y->color = 'B'; //Case 1 Check
z->parent->parent->color = 'R'; //Case 1 Check
z = z->parent->parent; //Case 1
}else{
if(z == z->parent->right){
z = z->parent; //Case 2
RBLeftRotate(z); //Case 2 Look at Rotate
}
z->parent->color = 'B'; //Case 3 Check
z->parent->parent->color = 'R'; //Case 3 Check
RBRightRotate(z->parent->parent); //Case 3 Look at Rotate
}
}else{
y = z->parent->parent->left;
if(y->color = 'R'){
z->parent->color = 'B'; //Case 1 Check
y->color = 'B'; //Case 1 Check
z->parent->parent->color = 'R'; //Case 1 Check
z = z->parent->parent; //Case 1
}else{
if(z = z->parent->left){
z = z->parent; //Case 2
RBRightRotate(z); //Case 2 Look at Rotate
}
z->parent->color = 'B'; //Case 3 Check
z->parent->parent->color = 'R'; //Case 3 Check
RBLeftRotate(z->parent->parent); //Case 3 Look at Rotate
}
}
}
root->color = 'B';
}
这是我的左右旋转:
void RBTree::RBLeftRotate(RBNode* x){
RBNode* y = x->right;
x->right = y->left;
y->left->parent = x;
y->parent = x->parent;
if(x->parent == RBTree::Tnil){
root = y;
}else if(x == x->parent->left){
x->parent->left = y;
}else{
x->parent->right = y;
}
y->left = x;
x->parent = y;
}
void RBTree::RBRightRotate(RBNode* x){
RBNode* y = x->left;
x->left = y->right;
y->right->parent = x;
y->parent = x->parent;
if(x->parent == RBTree::Tnil){
root = y;
}else if(x == x->parent->right){
x->parent->right = y;
}else{
x->parent->left = y;
}
y->right = x;
x->parent = y;
}
从我所看到的一切来看,我的着色是正确的,我的旋转也是正确的,但也许我错过了一些东西。关于为什么我的着色会关闭的任何帮助都会很棒。
【问题讨论】:
-
我能看到的一切 - 但你看到了什么?您是否逐步完成插入并观看每项作业?或者添加日志记录?您必须努力调试代码,而不仅仅是盯着源代码说“看起来不错”。
标签: c++ class red-black-tree