Switching Left and Right rotates in cleanup when parent is the right child of the grandparent
This commit is contained in:
parent
1685e58e29
commit
bf987db01a
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.
@ -42,13 +42,17 @@ void RB::ins(Node* node, Node* newnode){
|
|||||||
this -> ins(node -> get_rchild(), newnode);
|
this -> ins(node -> get_rchild(), newnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this -> cleanup(newnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RB::cleanup(Node* newnode){
|
||||||
Node* p = newnode -> get_parent();
|
Node* p = newnode -> get_parent();
|
||||||
Node* gp;
|
Node* gp;
|
||||||
|
|
||||||
while ((p != nullptr) && (p -> get_color() == red)){
|
while ((p != nullptr) && (p -> get_color() == red)){
|
||||||
gp = p -> get_parent();
|
gp = p -> get_parent();
|
||||||
if (gp == nullptr)
|
if (gp == nullptr)
|
||||||
return;
|
break;
|
||||||
if (p == (gp -> get_lchild())){
|
if (p == (gp -> get_lchild())){
|
||||||
//Case 1:
|
//Case 1:
|
||||||
if (gp -> get_rchild() != nullptr && gp -> get_rchild() -> get_color() == red){
|
if (gp -> get_rchild() != nullptr && gp -> get_rchild() -> get_color() == red){
|
||||||
@ -93,16 +97,18 @@ void RB::ins(Node* node, Node* newnode){
|
|||||||
else if(newnode == p -> get_lchild()){
|
else if(newnode == p -> get_lchild()){
|
||||||
newnode = p;
|
newnode = p;
|
||||||
p = newnode -> get_parent();
|
p = newnode -> get_parent();
|
||||||
left_rot(newnode);
|
//left_rot(newnode);
|
||||||
|
right_rot(newnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Case 3
|
//Case 3
|
||||||
else{
|
else{
|
||||||
p = newnode -> get_parent();
|
//p = newnode -> get_parent();
|
||||||
gp = p -> get_parent();
|
gp = p -> get_parent();
|
||||||
p -> set_color(black);
|
p -> set_color(black);
|
||||||
gp -> set_color(red);
|
gp -> set_color(red);
|
||||||
right_rot(gp);
|
//right_rot(gp);
|
||||||
|
left_rot(gp);
|
||||||
p = newnode -> get_parent();
|
p = newnode -> get_parent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,7 +116,66 @@ void RB::ins(Node* node, Node* newnode){
|
|||||||
this -> get_root() -> set_color(black);
|
this -> get_root() -> set_color(black);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RB::del(int key){
|
void RB::del(Node* node, int key){
|
||||||
|
if (key < node -> get_key())
|
||||||
|
del(node -> get_lchild(), key);
|
||||||
|
else if (key > node -> get_key())
|
||||||
|
del(node -> get_rchild(), key);
|
||||||
|
else if (key == node -> get_key()){
|
||||||
|
//Case 1: No children
|
||||||
|
if (node -> get_lchild() == nullptr && node -> get_rchild() == nullptr){
|
||||||
|
if (node -> get_parent() -> get_lchild() == node){
|
||||||
|
Node* p = node -> get_parent();
|
||||||
|
p -> set_lchild(nullptr);
|
||||||
|
node = p;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Node* p = node -> get_parent();
|
||||||
|
p -> set_rchild(nullptr);
|
||||||
|
node = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Case 2: No rchild
|
||||||
|
else if (node -> get_lchild() != nullptr && node -> get_rchild() == nullptr){
|
||||||
|
Node* p = node -> get_parent();
|
||||||
|
if (p -> get_lchild() == node){
|
||||||
|
node = node -> get_lchild();
|
||||||
|
p -> set_lchild(node);
|
||||||
|
node -> set_parent(p);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
node = node -> get_lchild();
|
||||||
|
p -> set_rchild(node);
|
||||||
|
node -> set_parent(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Case 3: Get successor
|
||||||
|
else{
|
||||||
|
Node* rtree = node -> get_rchild();
|
||||||
|
Node* p = node -> get_parent();
|
||||||
|
Node* l = node -> get_lchild();
|
||||||
|
Node* r = node -> get_rchild();
|
||||||
|
|
||||||
|
bool left = (p -> get_lchild() == node);
|
||||||
|
while(node -> get_lchild() != nullptr){
|
||||||
|
node = node -> get_lchild();
|
||||||
|
}
|
||||||
|
if (node -> get_rchild() != nullptr){
|
||||||
|
node -> get_parent() -> set_lchild(node -> get_rchild());
|
||||||
|
} node -> get_rchild() -> set_parent(node -> get_parent());
|
||||||
|
|
||||||
|
left ? p -> set_lchild(node) : p -> set_rchild(node);
|
||||||
|
node -> set_parent(p);
|
||||||
|
node -> set_lchild(l);
|
||||||
|
node -> set_rchild(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
std::cout << "Node does not exist in the tree" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this -> cleanup(node);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,12 +24,13 @@ class RB
|
|||||||
RB();
|
RB();
|
||||||
|
|
||||||
void ins(Node* node, Node* newnode);
|
void ins(Node* node, Node* newnode);
|
||||||
void del(int key);
|
void del(Node* node, int key);
|
||||||
void display(Node* node, Trunk* prev, bool left);
|
void display(Node* node, Trunk* prev, bool left);
|
||||||
Node* get_root();
|
Node* get_root();
|
||||||
|
|
||||||
void right_rot(Node* node);
|
void right_rot(Node* node);
|
||||||
void left_rot(Node* node);
|
void left_rot(Node* node);
|
||||||
|
void cleanup(Node* newnode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Node* root;
|
Node* root;
|
||||||
|
|||||||
41
src/main.cpp
41
src/main.cpp
@ -16,9 +16,48 @@ int main(int argc, char *argv[])
|
|||||||
tree.ins(tree.get_root(), newnode);
|
tree.ins(tree.get_root(), newnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "After insertion" << std::endl;
|
std::cout << "After insertion:" << std::endl;
|
||||||
tree.display(tree.get_root(), nullptr, false);
|
tree.display(tree.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Deleting 12:" << std::endl;
|
||||||
|
tree.del(tree.get_root(), 12);
|
||||||
|
tree.display(tree.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Inserting 32:" << std::endl;
|
||||||
|
Node* newnode = new Node(32);
|
||||||
|
tree.ins(tree.get_root(), newnode);
|
||||||
|
tree.display(tree.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Deleting 41:" << std::endl;
|
||||||
|
tree.del(tree.get_root(), 41);
|
||||||
|
tree.display(tree.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
|
||||||
|
RB tree2 = RB();
|
||||||
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,
|
||||||
625, 974, 221, 92, 374, 123, 838, 930, 654, 806, 234, 381};
|
625, 974, 221, 92, 374, 123, 838, 930, 654, 806, 234, 381};
|
||||||
|
|
||||||
|
std::cout << "Inserting initial keys from Part c..." << std::endl;
|
||||||
|
for (int k : insert_new){
|
||||||
|
Node* newnode = new Node(k);
|
||||||
|
tree2.ins(tree2.get_root(), newnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "After insertion:" << std::endl;
|
||||||
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
/*
|
||||||
|
std::cout << "Deleting 127:" << std::endl;
|
||||||
|
tree2.del(tree2.get_root(), 127);
|
||||||
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Deleting 221:" << std::endl;
|
||||||
|
tree2.del(tree2.get_root(), 221);
|
||||||
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
|
std::cout << "" << std::endl;
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user