-3
最終的にどのようにセグメンテーション違反を発生させずに赤い黒色のツリーにアイテムを挿入するのかがわかりました。Red Black Treeノードの正しい色付けが得られません
私は、次の順序でツリーに次の値を挿入しようとしています:4 3 2 6 5 1
私は次の取得順序どおりツリーをプリントアウトするために行くとき: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;
}
、私の着色が権利であると私の回転もありますが、多分私は何かが欠けています。私の配色がどうして消えてしまうのかについての助けは素晴らしいことでしょう。
_Fromすべては私がsee_ことができます:私は(パスがあなたのために残された親は、右-子である)以下の全体の非赤叔父のパスを作成することをお勧め
で?あなたは挿入を行い、すべての課題を見ましたか?またはロギングを追加しますか?コードをデバッグするには、ソースを目の当たりにするだけでなく、「正しいと思う」と言うようにしなければなりません。 – Useless