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;
}
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
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
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);
gp -> set_color(red);
newnode = gp;
p = newnode -> get_parent();
gp = p -> get_parent();
//Case 2:
else if(newnode == p -> get_lchild()){
newnode = p;
p = newnode -> get_parent();
//gp = p -> get_parent();
left_rot(newnode);
//Case 3
p -> set_color(black);
gp -> set_color(red);
right_rot(gp);
}
}
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);
}
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;

View File

@ -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();

View File

@ -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,