fixup commit
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user