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 -> cleanup(newnode);
|
||||
}
|
||||
|
||||
void RB::cleanup(Node* newnode){
|
||||
Node* p = newnode -> get_parent();
|
||||
Node* gp;
|
||||
|
||||
while ((p != nullptr) && (p -> get_color() == red)){
|
||||
gp = p -> get_parent();
|
||||
if (gp == nullptr)
|
||||
return;
|
||||
break;
|
||||
if (p == (gp -> get_lchild())){
|
||||
//Case 1:
|
||||
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()){
|
||||
newnode = p;
|
||||
p = newnode -> get_parent();
|
||||
left_rot(newnode);
|
||||
//left_rot(newnode);
|
||||
right_rot(newnode);
|
||||
}
|
||||
|
||||
//Case 3
|
||||
else{
|
||||
p = newnode -> get_parent();
|
||||
//p = newnode -> get_parent();
|
||||
gp = p -> get_parent();
|
||||
p -> set_color(black);
|
||||
gp -> set_color(red);
|
||||
right_rot(gp);
|
||||
//right_rot(gp);
|
||||
left_rot(gp);
|
||||
p = newnode -> get_parent();
|
||||
}
|
||||
}
|
||||
@ -110,7 +116,66 @@ void RB::ins(Node* node, Node* newnode){
|
||||
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();
|
||||
|
||||
void ins(Node* node, Node* newnode);
|
||||
void del(int key);
|
||||
void del(Node* node, int key);
|
||||
void display(Node* node, Trunk* prev, bool left);
|
||||
Node* get_root();
|
||||
|
||||
void right_rot(Node* node);
|
||||
void left_rot(Node* node);
|
||||
void cleanup(Node* newnode);
|
||||
|
||||
private:
|
||||
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);
|
||||
}
|
||||
|
||||
std::cout << "After insertion" << std::endl;
|
||||
std::cout << "After insertion:" << std::endl;
|
||||
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,
|
||||
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