错误似乎在函数insert和printTree中。我知道这个错误是由unique_ptr不可复制引起的。但我认为提供移动和复制语义应该可以帮助我解决它。 我的问题
我是否制作了副本并正确移动构造函数?
如果没有。我该如何重新设计代码。请列出基本错误以及如何纠正错误。
如何在课程中加入Node * parent?
在这种情况下,很少有关于良好代码实践的提示会有所帮助
// This is implementation of binary search tree.
#ifndef BinarySearchTree_H
#define BinarySearchTree_H
#include <cstdio>
#include <functional>
#include <utility>
#include <vector>
#include <iostream>
#include <memory>
//template declaration
template <class ValueType>
class BinarySearchTree
{
struct Node
{
ValueType value;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
//Node *parent=nullptr; // How can I use parent in the class ?
Node(){}
//Node(const ValueType& value,std::unique_ptr<Node> left,std::unique_ptr<Node> right):value(value),left(left),right(right){}
Node (const ValueType& value):value(value),left(nullptr),right(nullptr){}
};
std::unique_ptr<Node> root;
void insert(const ValueType& value, std::unique_ptr<Node> node)
{
if(value< node->value)
{
if(node->left)
{
insert(value,node->left);
}
else
{
std::unique_ptr<Node> left=std::unique_ptr<Node>(new Node(value));
node->left=left;
}
}
else
{
if(node->right)
{
insert(value,node->right);
}
else
{
std::unique_ptr<Node> right=std::unique_ptr<Node>(new Node(value));
node->right=right;
//right->parent=node;
}
}
}
void printNode(std::unique_ptr<Node> node)
{
if(!node)
{
std::cout<<"No element in the tree\n";
}
else
{
if(node->left)
{
std::cout<<node->left->value<<" ";
}
std::cout<<node->value<<" ";
if(node->right)
{
std::cout<<node->right->value<<" ";
}
}
}
public:
BinarySearchTree():root(nullptr){}
~BinarySearchTree(){}
BinarySearchTree( BinarySearchTree && rhs):root(std::move(rhs.root)){}
BinarySearchTree& operator=(BinarySearchTree && rhs )
{
root=std::move(rhs.root);
return *this;
}
BinarySearchTree& operator=(const BinarySearchTree & rhs )
{
if(this!=&rhs)
root.reset(rhs.root);
return *this;
}
void insert(const ValueType& value)
{
if(root==nullptr)
{
root=std::unique_ptr<Node>(new Node(value));
}
else
{
insert(value,root);
}
}
// void remove(const ValueTypr& value);
void printTree(const BinarySearchTree& tree)
{
if(tree.root)
{
if(tree.root->left)
{
printNode(tree.root->left);
}
printNode(tree.root);
if(tree.root->right)
{
printNode(tree.root->right);
}
}
else
{
std::cout<<"tree is empty\n";
return;
}
}
};
#endif // BinarySearchTree
答案 0 :(得分:2)
Node* parent
。父母拥有子女,反之亦然。std::make_unique()
。避免包括您不需要的标题。 printTree()
对this
无效的原因是否有原因?通常,您可以使用稍微更易读的语法(缩进,空行等)