C++ 在二叉搜索树中返回具有最小值的节点,该二叉搜索树使用模板和唯一\u ptr实现
我正在尝试用惟一的ptr实现BST。我想用BST中的最小值返回节点。我知道如何返回最小值,并为此编写了函数,但如果我想返回节点呢?我上的课有可能吗C++ 在二叉搜索树中返回具有最小值的节点,该二叉搜索树使用模板和唯一\u ptr实现,c++,c++11,binary-search-tree,unique-ptr,C++,C++11,Binary Search Tree,Unique Ptr,我正在尝试用惟一的ptr实现BST。我想用BST中的最小值返回节点。我知道如何返回最小值,并为此编写了函数,但如果我想返回节点呢?我上的课有可能吗 #include <iostream> #include <memory> template<class T> class BinarySearchTree{ struct TreeNode; typedef std::unique_ptr<TreeNode> spTreeNode;
#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的副本?关键是考虑引用/指针的有效期 坦率地说,我不认为这些都是一个好主意的公共界面。假设您将getMinNode设置为私有,并将getMin设置为公共:
所以,我不应该从公共接口的角度返回节点?@IanMcGrath您的节点是树的内部实现细节。你为什么要返回它?我认为你从向公众用户返回类型t的最小值(即数据加上两个智能指针,其中一个或两个都是空的)中得不到任何好处。@t.C.让我想起了Top Cat,无论如何,我离题了,我也这么认为。我只是想知道有没有办法以防我不得不这么做。这是在线测试,我可能必须根据我现在不知道的设置接口编写代码。@NicholasM,如果返回最小值和最小节点都不正确,我该如何返回最小值?另一个注意事项:getMin将在空的BinarySearchTree上segfault。处理这个问题的一种方法是向用户提供一个成员函数bool empty const和document,用户必须仅为非空树调用getMin。例如,与std::vector中的前端访问器的情况相同。@NicholasM,是的,这是一个很好的观点。
// 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;
}