diff --git a/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o b/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o index 282fd2e..dc7142b 100644 Binary files a/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o and b/build/CMakeFiles/RBlib.dir/src/Red-Black.cpp.o differ diff --git a/build/CMakeFiles/main.dir/src/main.cpp.o b/build/CMakeFiles/main.dir/src/main.cpp.o index 15b3324..4dc8252 100644 Binary files a/build/CMakeFiles/main.dir/src/main.cpp.o and b/build/CMakeFiles/main.dir/src/main.cpp.o differ diff --git a/build/libRBlib.a b/build/libRBlib.a index 27143a9..a3e7b0b 100644 Binary files a/build/libRBlib.a and b/build/libRBlib.a differ diff --git a/build/main b/build/main index 4d9d446..556cba5 100755 Binary files a/build/main and b/build/main differ diff --git a/src/Red-Black.cpp b/src/Red-Black.cpp index cc12cb5..8c1a858 100644 --- a/src/Red-Black.cpp +++ b/src/Red-Black.cpp @@ -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; diff --git a/src/Red-Black.h b/src/Red-Black.h index a401965..903bc1d 100644 --- a/src/Red-Black.h +++ b/src/Red-Black.h @@ -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(); diff --git a/src/main.cpp b/src/main.cpp index 3bc39e3..7c72409 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,9 +10,14 @@ int main(int argc, char *argv[]) std::vector 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 insert_new {834, 807, 512, 882, 127, 675, 75, 216, 822, 249, 114, 689,