Ver código fonte

fixed deleteMin corner case

Abhinav Sinha 8 anos atrás
pai
commit
62ff0debc1
1 arquivos alterados com 13 adições e 4 exclusões
  1. 13 4
      program3/AVLCommands.cpp

+ 13 - 4
program3/AVLCommands.cpp

@@ -285,7 +285,7 @@ bool AVLCommands::Delete(int key) {
 				parent->ReplaceChild(currentNode, currentNode->left_);
 				size_--; assert(size_ >= 0);
 			} else {
-				currentNode->key_ = DeleteMin(currentNode);
+				currentNode->key_ = DeleteMin(currentNode->right_);
 			}
 		}
 		currentNode = (key < currentNode->key_) ?
@@ -364,10 +364,19 @@ int AVLCommands::DeleteMin(std::shared_ptr<BSTNode> currentNode) {
 	} else {
 		// lastNode under the root
 		if (lastNode->right_ != nullptr) {
-			parent->left_ = lastNode->right_;
-			lastNode->right_->parent_ = parent;
+			if (parent->left_ == lastNode){
+				parent->left_ = lastNode->right_;
+				lastNode->right_->parent_ = parent;
+			} else {
+				parent->right_ = lastNode->right_;
+				lastNode->right_->parent_ = parent;
+			}
 		} else {
-			parent->left_ = nullptr;
+			if (parent->left_ == lastNode){
+				parent->left_ = nullptr;
+			} else {
+				parent->right_ = nullptr;
+			}
 		}
   }
 	size_--; assert(size_ >= 0);