fixup commit

This commit is contained in:
2019-05-12 16:31:11 +02:00
parent e5b5eb3e72
commit 7eca47ac64

View File

@@ -11,9 +11,14 @@ struct Node
std::unique_ptr<Node<T>> left; std::unique_ptr<Node<T>> left;
std::unique_ptr<Node<T>> right; std::unique_ptr<Node<T>> right;
bool HasChildren() const
{
return static_cast<bool>(left) || static_cast<bool>(right);
}
bool IsLeaf() const bool IsLeaf() const
{ {
return left == nullptr && right == nullptr; return !HasChildren();
} }
Node(T const &_value) Node(T const &_value)
@@ -30,40 +35,52 @@ class Tree
private: private:
std::unique_ptr<Node<T>> root; std::unique_ptr<Node<T>> root;
std::unique_ptr<Node<T>> & GetRightMostLeaf(std::unique_ptr<Node<T>> &node) T ExtractSmallestLeaf(std::unique_ptr<Node<T>> &node)
{ {
std::unique_ptr<Node<T>> *nodePtr = &node; std::unique_ptr<Node<T>> *nodePtr = &(node);
while ((*nodePtr)->right != nullptr) while ((*nodePtr)->HasChildren())
{ {
nodePtr = &((*nodePtr)->right); if((*nodePtr)->left)
} {
nodePtr = &((*nodePtr)->left);
}
else
{
T value = (*nodePtr)->value;
(*nodePtr) = std::move((*nodePtr)->right);
return value;
}
}
return *nodePtr; T value = (*nodePtr)->value;
(*nodePtr).release();
return value;
} }
void DeleteNode(std::unique_ptr<Node<T>> & node) void DeleteNode(std::unique_ptr<Node<T>> & node)
{ {
if(node || node->IsLeaf()) if(!node || node->IsLeaf())
{ {
node.release(); node.release();
return;
} }
if(node->left) if(!(node->left))
{ {
node = std::move(node->right); node = std::move(node->right);
return;
} }
if(node->right) if(!(node->right))
{ {
node = std::move(node->left); node = std::move(node->left);
return;
} }
auto & replacementNode = GetRightMostLeaf(node); // In order successor
replacementNode->left.swap(node->left);
replacementNode->right.swap(node->right);
node.swap(replacementNode);
replacementNode.release(); auto newNodeValue = ExtractSmallestLeaf(node->right);
node->value = newNodeValue;
} }
std::unique_ptr<Node<T>> & FindNode(T const & value) std::unique_ptr<Node<T>> & FindNode(T const & value)
@@ -80,7 +97,6 @@ private:
currentPtr = &((*currentPtr)->right); currentPtr = &((*currentPtr)->right);
} }
} }
return *currentPtr; return *currentPtr;
} }
@@ -121,10 +137,6 @@ public:
void Delete(T const & value) void Delete(T const & value)
{ {
auto & node = FindNode(value); auto & node = FindNode(value);
if (node)
{
return;
}
DeleteNode(node); DeleteNode(node);
} }