我正在使用std :: unique_ptr编写BST树的C ++实现。
我是一个业余程序员。最初,我使用辅助函数编写了一个插入函数,并使用移动语义传递了指针,但这迫使我返回unique_ptr。然后,我考虑将指针传递给unique_ptr。我什至考虑使用unique_ptr :: get()并发送一个指向binaryNode的指针,但是我已经读到该函数仅在与旧版函数接口时才应使用(未显示实现)。
template<class K, class V = char>
struct binaryNode
{
using nodePtr = std::unique_ptr<binaryNode<K, V>>;
using keyType = K;
using valueType = V;
binaryNode(keyType key, valueType val) : _key(key), _value(val) {};
binaryNode(const binaryNode& n) = delete;
~binaryNode() = default;
keyType _key = keyType();
valueType _value = valueType();
nodePtr l_node = nullptr;
nodePtr r_node = nullptr;
};
template<class K, class V = char>
class BSTree
{
public:
using nodePtr = std::unique_ptr<binaryNode<K, V>>;
using keyType = K;
using valueType = V;
BSTree() {}
void insert(const keyType & key, const valueType & value);
void insert2(const keyType & key, const valueType & value);
private:
nodePtr insertHelper(nodePtr && root, const K & key, const V & value);
void insertHelper2(nodePtr * root, const K & key, const V & value);
nodePtr _root = nullptr;
};
template<class K, class V>
void BSTree<K, V>::insert(const keyType & key)
{
_root = insertHelper(std::move(_root), key);
if (!isBalanced(_root)) _root = rebalance(std::move(_root));
}
template<class K, class V>
typename BSTree<K, V>::nodePtr BSTree<K, V>::insertHelper(nodePtr && root, const keyType & key, const valueType & value)
{
if (root == nullptr) return std::make_unique<binaryNode<K, V>>(std::move(binaryNode<K, V>(key)));
if (key < root->_key) root->l_node = insertHelper(std::move(root->l_node), key, value);
if (key > root->_key) root->r_node = insertHelper(std::move(root->r_node), key, value);
return std::move(root);
}
template<class K, class V>
void BSTree<K, V>::insert2(const keyType & key, const valueType & value)
{
insertHelper2(&_root, key, value);
if (!isBalanced(_root)) _root = rebalance(std::move(_root));
}
template<class K, class V>
void BSTree<K, V>::insertHelper2(nodePtr * root, const K & key, const V & value)
{
if (*root == nullptr) *root = std::make_unique<binaryNode<K, V>>(std::move(binaryNode<K, V>(key, value)));
if (key < (*root)->_key) insertHelper(&((*root)->l_node), key, value);
if (key > (*root)->_key) insertHelper(&((*root)->r_node), key, value);
}
从功能上讲,这两种方法给出相同的树结构。我没有尝试对这两种方法进行计时,但是我对这些方法中的哪一种被视为“正确”感到好奇。还是有我没有想到的更好的方法?
编辑:错别字固定