繁体   English   中英

用模板和unique_ptr实现的二进制搜索树中具有最小值的返回节点

[英]Returning node with minimum value in a binary search tree implemented with templates and unique_ptr

我正在尝试使用unique_ptr实现BST。 我想返回BST中具有最小值的节点 我知道如何返回最小值,并为此编写了函数,但是如果要返回节点怎么办? 我上的课有可能吗?

#include <iostream>
#include <memory>

template<class T>
class BinarySearchTree{
    struct TreeNode;
    typedef std::unique_ptr<TreeNode> spTreeNode;
    struct TreeNode{
        T data;
        spTreeNode  left;
        spTreeNode  right;
        TreeNode(const T & value):data(value),left(nullptr),right(nullptr){}
    };



    spTreeNode root;
    bool insert(spTreeNode &node);
    void print(const spTreeNode&) const ;
public:
    BinarySearchTree();
    void insert( const T & node);
    void print()const;
    T getMin();

};

template<class T>
BinarySearchTree<T>::BinarySearchTree():root(nullptr){}

template<class T>
void BinarySearchTree<T>::insert(const T & ref)
{
    std::unique_ptr<TreeNode> node(new TreeNode(ref));
    if (root == nullptr) {
        root = std::move(node);
    } else {
        TreeNode* temp = root.get();
        TreeNode* prev = root.get();
        while (temp != nullptr) {
            prev = temp;
            if (temp->data < ref)
                temp = temp->right.get();
            else
                temp = temp->left.get();
        }
        if (prev->data < ref)
            prev->right = std::move(node);
        else
            prev->left = std::move(node);
    }
}


template<class T>
T BinarySearchTree<T>::getMin()
{
    TreeNode* temp = root.get();
    TreeNode *prev = nullptr;
    while (temp)
    {
        prev = temp;
        temp = temp->left.get();
    }
    return prev->data;
}


int main()
{
    BinarySearchTree<int> bst;
    bst.insert(13);
    bst.insert(3);
    bst.insert(5);
    bst.insert(31);
    bst.insert(511);
    bst.insert(311);
    std::cout << bst.getMin(); // Works but what if I want to return the Node?
    return 0;
}

您必须确定所需的接口。 您想返回一个指向现存TreeNode的const指针吗? 对TreeNode的const引用? TreeNode的副本? 关键是要考虑引用/指针有效的时间。

坦率地说,我认为这些都不是公开接口的好主意。 假设您将getMinNode()私有,并将getMin()公开:

// Returns non-owning pointer; do not attempt to delete TreeNode.
template<class T>
const BinarySearchTree<T>::TreeNode* BinarySearchTree<T>::getMinNode() const
{
    // Like getMin(), but return prev
    // Does this work for empty BinarySearchTree?
    TreeNode* temp = root.get();
    TreeNode *prev = nullptr;
    while (temp)
    {
        prev = temp;
        temp = temp->left.get();
    }
    return prev;
}

template<class T>
T BinarySearchTree<T>::getMin() const   // member function is const
{
    return getMinNode()->data;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM