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;
|
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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user