Insertion Correction and Display() adds color

This commit is contained in:
Noah L. Schrick 2022-04-09 22:30:22 -05:00
parent 1eeb174511
commit e7c7132261
7 changed files with 58 additions and 39 deletions

Binary file not shown.

Binary file not shown.

View File

@ -17,8 +17,9 @@ RB::RB()
root = nullptr; root = nullptr;
} }
void RB::ins(Node* node, int key){ void RB::ins(Node* node, Node* newnode){
Node* newnode = new Node(key); int key = newnode -> get_key();
std::cout << "Inserting " << key << std::endl;
if (root == nullptr){ if (root == nullptr){
root = newnode; root = newnode;
newnode -> set_color(black); newnode -> set_color(black);
@ -30,7 +31,7 @@ void RB::ins(Node* node, int key){
newnode -> set_color(red); newnode -> set_color(red);
} }
else else
this -> ins(node -> get_lchild(), key); this -> ins(node -> get_lchild(), newnode);
} }
else{ else{
if (node -> get_rchild() == nullptr){ if (node -> get_rchild() == nullptr){
@ -40,16 +41,20 @@ void RB::ins(Node* node, int key){
} }
else else
this -> ins(node -> get_rchild(), key); this -> ins(node -> get_rchild(), newnode);
} }
Node* p = newnode -> get_parent(); 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)){ while ((p != nullptr) && (p -> get_color() == red)){
gp = p -> get_parent();
if (gp == nullptr)
return;
if (p == (gp -> get_lchild())){ if (p == (gp -> get_lchild())){
//Case 1: //Case 1:
if (gp -> get_rchild() -> get_color() == red){ if (gp -> get_rchild() != nullptr && gp -> get_rchild() -> get_color() == red){
//Recolor //Recolor
gp -> set_color(red); gp -> set_color(red);
gp -> get_rchild() -> set_color(black); gp -> get_rchild() -> set_color(black);
@ -57,46 +62,50 @@ void RB::ins(Node* node, int key){
//GP is our new "newnode" //GP is our new "newnode"
newnode = gp; newnode = gp;
p = newnode -> get_parent(); p = newnode -> get_parent();
gp = p -> get_parent(); //gp = p -> get_parent();
} }
//Case 2: //Case 2:
else if(newnode == p -> get_rchild()){ else if(newnode == p -> get_rchild()){
newnode = p; newnode = p;
p = newnode -> get_parent(); p = newnode -> get_parent();
gp = p -> get_parent(); //gp = p -> get_parent();
left_rot(newnode); left_rot(newnode);
//Case 3
p -> set_color(black);
gp -> set_color(red);
right_rot(gp);
}
} //end if p = lchild of gp
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();
} }
//Case 3 //Case 2:
p -> set_color(black); else if(newnode == p -> get_lchild()){
gp -> set_color(red); newnode = p;
right_rot(gp); p = newnode -> get_parent();
} //end if p = lchild of gp //gp = p -> get_parent();
left_rot(newnode);
if (gp -> get_lchild() -> get_color() == red){ //Case 3
//Set colors p -> set_color(black);
gp -> get_lchild() -> set_color(black); gp -> set_color(red);
gp -> get_rchild() -> set_color(black); right_rot(gp);
gp -> set_color(red); }
newnode = gp;
p = newnode -> get_parent();
gp = p -> get_parent();
} }
//this -> get_root() -> set_color(black);
else if (p -> get_lchild() == newnode){
newnode = p;
p = newnode -> get_parent();
gp = p -> get_parent();
right_rot(newnode);
p -> set_color(black);
gp -> set_color(red);
left_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){ void RB::del(int key){
@ -133,7 +142,12 @@ void RB::display(Node *node, Trunk *prev, bool left){
} }
showTrunks(trunk); 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) { if (prev) {
prev->str = prev_str; prev->str = prev_str;

View File

@ -23,7 +23,7 @@ class RB
public: public:
RB(); RB();
void ins(Node* node, int key); void ins(Node* node, Node* newnode);
void del(int key); void del(int key);
void display(Node* node, Trunk* prev, bool left); void display(Node* node, Trunk* prev, bool left);
Node* get_root(); Node* get_root();

View File

@ -10,9 +10,14 @@ int main(int argc, char *argv[])
std::vector<int> init_keys {41, 38, 31, 12, 19, 8}; std::vector<int> init_keys {41, 38, 31, 12, 19, 8};
RB tree = RB(); RB tree = RB();
for (int k : init_keys) std::cout << "Inserting initial keys from Part a..." << std::endl;
tree.ins(tree.get_root(), k); 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); tree.display(tree.get_root(), nullptr, false);
std::vector<int> insert_new {834, 807, 512, 882, 127, 675, 75, 216, 822, 249, 114, 689, std::vector<int> insert_new {834, 807, 512, 882, 127, 675, 75, 216, 822, 249, 114, 689,