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