Fixing edge cases from deletion when right subtree of deleted node has no left child

This commit is contained in:
Noah L. Schrick 2022-04-20 18:54:33 -05:00
parent bf987db01a
commit 90c6f70530
6 changed files with 21 additions and 15 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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,36 +140,41 @@ 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();
if (p -> get_lchild() == node){ Node* lchild = node -> get_lchild();
node = node -> get_lchild(); node -> set_parent(nullptr);
p -> set_lchild(node); node -> set_lchild(nullptr);
node -> set_parent(p); if (p -> get_lchild() == node){
p -> set_lchild(lchild);
} }
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){
node -> get_parent() -> set_lchild(node -> get_rchild()); if(node != r){
} node -> get_rchild() -> set_parent(node -> get_parent()); 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); 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);
node -> set_rchild(r); if(node != r)
node -> set_rchild(r);
} }
} }
else{ else{

View File

@ -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;
*/
} }