Fixing edge cases from deletion when right subtree of deleted node has no left child
This commit is contained in:
parent
bf987db01a
commit
90c6f70530
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.
@ -126,11 +126,13 @@ void RB::del(Node* node, int key){
|
|||||||
if (node -> get_lchild() == nullptr && node -> get_rchild() == nullptr){
|
if (node -> get_lchild() == nullptr && node -> get_rchild() == nullptr){
|
||||||
if (node -> get_parent() -> get_lchild() == node){
|
if (node -> get_parent() -> get_lchild() == node){
|
||||||
Node* p = node -> get_parent();
|
Node* p = node -> get_parent();
|
||||||
|
node -> set_parent(nullptr);
|
||||||
p -> set_lchild(nullptr);
|
p -> set_lchild(nullptr);
|
||||||
node = p;
|
node = p;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
Node* p = node -> get_parent();
|
Node* p = node -> get_parent();
|
||||||
|
node -> set_parent(nullptr);
|
||||||
p -> set_rchild(nullptr);
|
p -> set_rchild(nullptr);
|
||||||
node = p;
|
node = p;
|
||||||
}
|
}
|
||||||
@ -138,35 +140,40 @@ void RB::del(Node* node, int key){
|
|||||||
//Case 2: No rchild
|
//Case 2: No rchild
|
||||||
else if (node -> get_lchild() != nullptr && node -> get_rchild() == nullptr){
|
else if (node -> get_lchild() != nullptr && node -> get_rchild() == nullptr){
|
||||||
Node* p = node -> get_parent();
|
Node* p = node -> get_parent();
|
||||||
|
Node* lchild = node -> get_lchild();
|
||||||
|
node -> set_parent(nullptr);
|
||||||
|
node -> set_lchild(nullptr);
|
||||||
if (p -> get_lchild() == node){
|
if (p -> get_lchild() == node){
|
||||||
node = node -> get_lchild();
|
p -> set_lchild(lchild);
|
||||||
p -> set_lchild(node);
|
|
||||||
node -> set_parent(p);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
node = node -> get_lchild();
|
p -> set_rchild(lchild);
|
||||||
p -> set_rchild(node);
|
|
||||||
node -> set_parent(p);
|
|
||||||
}
|
}
|
||||||
|
lchild -> set_parent(p);
|
||||||
|
node = lchild;
|
||||||
}
|
}
|
||||||
//Case 3: Get successor
|
//Case 3: Get successor
|
||||||
else{
|
else{
|
||||||
Node* rtree = node -> get_rchild();
|
|
||||||
Node* p = node -> get_parent();
|
Node* p = node -> get_parent();
|
||||||
Node* l = node -> get_lchild();
|
Node* l = node -> get_lchild();
|
||||||
Node* r = node -> get_rchild();
|
Node* r = node -> get_rchild();
|
||||||
|
|
||||||
bool left = (p -> get_lchild() == node);
|
bool left = (p -> get_lchild() == node);
|
||||||
|
|
||||||
|
node = r;
|
||||||
while(node -> get_lchild() != nullptr){
|
while(node -> get_lchild() != nullptr){
|
||||||
node = node -> get_lchild();
|
node = node -> get_lchild();
|
||||||
}
|
}
|
||||||
if (node -> get_rchild() != nullptr){
|
if (node -> get_rchild() != nullptr){
|
||||||
|
if(node != r){
|
||||||
node -> get_parent() -> set_lchild(node -> get_rchild());
|
node -> get_parent() -> set_lchild(node -> get_rchild());
|
||||||
} node -> get_rchild() -> set_parent(node -> get_parent());
|
node -> get_rchild() -> set_parent(node -> get_parent());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
left ? p -> set_lchild(node) : p -> set_rchild(node);
|
left ? p -> set_lchild(node) : p -> set_rchild(node);
|
||||||
node -> set_parent(p);
|
node -> set_parent(p);
|
||||||
node -> set_lchild(l);
|
node -> set_lchild(l);
|
||||||
|
if(node != r)
|
||||||
node -> set_rchild(r);
|
node -> set_rchild(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,7 +49,7 @@ int main(int argc, char *argv[])
|
|||||||
std::cout << "After insertion:" << std::endl;
|
std::cout << "After insertion:" << std::endl;
|
||||||
tree2.display(tree2.get_root(), nullptr, false);
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
std::cout << "" << std::endl;
|
std::cout << "" << std::endl;
|
||||||
/*
|
|
||||||
std::cout << "Deleting 127:" << std::endl;
|
std::cout << "Deleting 127:" << std::endl;
|
||||||
tree2.del(tree2.get_root(), 127);
|
tree2.del(tree2.get_root(), 127);
|
||||||
tree2.display(tree2.get_root(), nullptr, false);
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
@ -59,5 +59,4 @@ int main(int argc, char *argv[])
|
|||||||
tree2.del(tree2.get_root(), 221);
|
tree2.del(tree2.get_root(), 221);
|
||||||
tree2.display(tree2.get_root(), nullptr, false);
|
tree2.display(tree2.get_root(), nullptr, false);
|
||||||
std::cout << "" << std::endl;
|
std::cout << "" << std::endl;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user