Insertion Correction and Display() adds color
This commit is contained in:
parent
1eeb174511
commit
e7c7132261
Binary file not shown.
Binary file not shown.
BIN
build/libRBlib.a
BIN
build/libRBlib.a
Binary file not shown.
BIN
build/main
BIN
build/main
Binary file not shown.
@ -17,8 +17,9 @@ RB::RB()
|
||||
root = nullptr;
|
||||
}
|
||||
|
||||
void RB::ins(Node* node, int key){
|
||||
Node* newnode = new Node(key);
|
||||
void RB::ins(Node* node, Node* newnode){
|
||||
int key = newnode -> get_key();
|
||||
std::cout << "Inserting " << key << std::endl;
|
||||
if (root == nullptr){
|
||||
root = newnode;
|
||||
newnode -> set_color(black);
|
||||
@ -30,7 +31,7 @@ void RB::ins(Node* node, int key){
|
||||
newnode -> set_color(red);
|
||||
}
|
||||
else
|
||||
this -> ins(node -> get_lchild(), key);
|
||||
this -> ins(node -> get_lchild(), newnode);
|
||||
}
|
||||
else{
|
||||
if (node -> get_rchild() == nullptr){
|
||||
@ -40,16 +41,20 @@ void RB::ins(Node* node, int key){
|
||||
|
||||
}
|
||||
else
|
||||
this -> ins(node -> get_rchild(), key);
|
||||
this -> ins(node -> get_rchild(), newnode);
|
||||
}
|
||||
|
||||
Node* p = newnode -> get_parent();
|
||||
Node* gp = p -> get_parent();
|
||||
Node* gp;
|
||||
|
||||
std::cout << "Inserted, but now correcting" << std::endl;
|
||||
while ((p != nullptr) && (p -> get_color() == red)){
|
||||
gp = p -> get_parent();
|
||||
if (gp == nullptr)
|
||||
return;
|
||||
if (p == (gp -> get_lchild())){
|
||||
//Case 1:
|
||||
if (gp -> get_rchild() -> get_color() == red){
|
||||
if (gp -> get_rchild() != nullptr && gp -> get_rchild() -> get_color() == red){
|
||||
//Recolor
|
||||
gp -> set_color(red);
|
||||
gp -> get_rchild() -> set_color(black);
|
||||
@ -57,46 +62,50 @@ void RB::ins(Node* node, int key){
|
||||
//GP is our new "newnode"
|
||||
newnode = gp;
|
||||
p = newnode -> get_parent();
|
||||
gp = p -> get_parent();
|
||||
//gp = p -> get_parent();
|
||||
}
|
||||
|
||||
//Case 2:
|
||||
else if(newnode == p -> get_rchild()){
|
||||
newnode = p;
|
||||
p = newnode -> get_parent();
|
||||
gp = p -> get_parent();
|
||||
//gp = p -> get_parent();
|
||||
left_rot(newnode);
|
||||
}
|
||||
|
||||
//Case 3
|
||||
p -> set_color(black);
|
||||
gp -> set_color(red);
|
||||
right_rot(gp);
|
||||
}
|
||||
} //end if p = lchild of gp
|
||||
|
||||
if (gp -> get_lchild() -> get_color() == red){
|
||||
//Set colors
|
||||
gp -> get_lchild() -> set_color(black);
|
||||
gp -> get_rchild() -> set_color(black);
|
||||
else{
|
||||
//Case 1:
|
||||
if (gp -> get_lchild() != nullptr && gp -> get_lchild() -> get_color() == red){
|
||||
//Recolor
|
||||
gp -> set_color(red);
|
||||
|
||||
gp -> get_lchild() -> set_color(black);
|
||||
p -> set_color(black);
|
||||
//GP is our new "newnode"
|
||||
newnode = gp;
|
||||
p = newnode -> get_parent();
|
||||
gp = p -> get_parent();
|
||||
//gp = p -> get_parent();
|
||||
}
|
||||
|
||||
else if (p -> get_lchild() == newnode){
|
||||
//Case 2:
|
||||
else if(newnode == p -> get_lchild()){
|
||||
newnode = p;
|
||||
p = newnode -> get_parent();
|
||||
gp = p -> get_parent();
|
||||
right_rot(newnode);
|
||||
|
||||
//gp = p -> get_parent();
|
||||
left_rot(newnode);
|
||||
//Case 3
|
||||
p -> set_color(black);
|
||||
gp -> set_color(red);
|
||||
left_rot(gp);
|
||||
right_rot(gp);
|
||||
}
|
||||
}
|
||||
//this -> get_root() -> set_color(black);
|
||||
}
|
||||
this -> get_root() -> set_color(black);
|
||||
}
|
||||
std::cout << "Finished correcting" << std::endl;
|
||||
}
|
||||
|
||||
void RB::del(int key){
|
||||
@ -133,7 +142,12 @@ void RB::display(Node *node, Trunk *prev, bool left){
|
||||
}
|
||||
|
||||
showTrunks(trunk);
|
||||
std::cout << " " << node -> get_key() << std::endl;
|
||||
std::string col;
|
||||
if (node -> get_color() == red)
|
||||
col = "R";
|
||||
else
|
||||
col = "B";
|
||||
std::cout << " " << node -> get_key() << "(" << col << ")" << std::endl;
|
||||
|
||||
if (prev) {
|
||||
prev->str = prev_str;
|
||||
|
||||
@ -23,7 +23,7 @@ class RB
|
||||
public:
|
||||
RB();
|
||||
|
||||
void ins(Node* node, int key);
|
||||
void ins(Node* node, Node* newnode);
|
||||
void del(int key);
|
||||
void display(Node* node, Trunk* prev, bool left);
|
||||
Node* get_root();
|
||||
|
||||
@ -10,9 +10,14 @@ int main(int argc, char *argv[])
|
||||
std::vector<int> init_keys {41, 38, 31, 12, 19, 8};
|
||||
RB tree = RB();
|
||||
|
||||
for (int k : init_keys)
|
||||
tree.ins(tree.get_root(), k);
|
||||
std::cout << "Inserting initial keys from Part a..." << std::endl;
|
||||
for (int k : init_keys){
|
||||
Node* newnode = new Node(k);
|
||||
tree.ins(tree.get_root(), newnode);
|
||||
tree.display(tree.get_root(), nullptr, false);
|
||||
}
|
||||
|
||||
std::cout << "After insertion" << std::endl;
|
||||
tree.display(tree.get_root(), nullptr, false);
|
||||
|
||||
std::vector<int> insert_new {834, 807, 512, 882, 127, 675, 75, 216, 822, 249, 114, 689,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user