如何在C+中实现BST的复制构造函数和重载相等运算符+; 我需要用C++实现BST的各种功能。其中两种方法,复制构造函数和重载相等运算符,我对它们的确切逻辑以及如何将该逻辑转化为代码感到困惑
到目前为止,我认为逻辑应该是这样的:如何在C+中实现BST的复制构造函数和重载相等运算符+; 我需要用C++实现BST的各种功能。其中两种方法,复制构造函数和重载相等运算符,我对它们的确切逻辑以及如何将该逻辑转化为代码感到困惑,c++,copy,operator-overloading,binary-search-tree,C++,Copy,Operator Overloading,Binary Search Tree,到目前为止,我认为逻辑应该是这样的: 将调用复制构造函数,并使用equal重载运算符将复制树设置为本地树 equal重载方法逐步访问树的每个节点,并复制每个节点的确切属性,以便使树完全相同,这将有望产生深度复制 这就是我迄今为止所尝试的 template <class DataType> class BSTree { private: // You may NOT add any data members struct node; typedef node*
template <class DataType>
class BSTree
{
private:
// You may NOT add any data members
struct node;
typedef node* nodePtr;
struct node
{
DataType element;
nodePtr right;
nodePtr left;
};
int count;
nodePtr root;
public:
// Default constructor
BSTree()
{
root = NULL;
}
// Copy constructor
BSTree(const BSTree<DataType>& copyTree)
{
this = copyTree; //utilizes the overloaded = operator
}
// Equal overload
const BSTree& operator =(const BSTree& rhs)
{
recursiveStepThrough(rhs, root);
}
void recursiveStepThrough(const BSTree& rhs, nodePtr curr) {
if (curr != NULL) {
if (curr->left != NULL) { recursiveStepThrough(rhs, curr->left); }
nodePtr temp = new node;
rhs->element = curr->element;
rhs->right = curr->right;
rhs->left = curr->left;
if (curr->right != NULL) { recursiveStepThrough(rhs, curr->right); }
}
}
模板
类B树
{
私人:
//您不能添加任何数据成员
结构节点;
typedef节点*nodePtr;
结构节点
{
数据类型元素;
无接受权;
诺德普左;
};
整数计数;
无柄根;
公众:
//默认构造函数
b树()
{
root=NULL;
}
//复制构造函数
B树(常量B树和复制树)
{
this=copyTree;//使用重载的=运算符
}
//等过载
常量BSTree和运算符=(常量BSTree和rhs)
{
递归逐步通过(rhs,根);
}
void recursiveStepThrough(常量B树和rhs,节点接受当前){
if(curr!=NULL){
如果(curr->left!=NULL){recursiveStepThrough(rhs,curr->left);}
nodePtr temp=新节点;
rhs->element=curr->element;
右侧->右侧=当前->右侧;
右->左=当前->左;
如果(curr->right!=NULL){recursiveStepThrough(rhs,curr->right);}
}
}
我只得到了私有数据成员和方法头。我可以创建任何我希望的新函数,但我希望保留讲师提供给我的函数。关于逻辑或实现的任何帮助都会有很大帮助。请注意:
const-BSTree&operator=(const-BSTree&)
不是“equal”运算符,但不是赋值运算符。正确的惯用返回类型应为BSTree&
(不含const
)(这样做是为了允许将赋值与非常量访问链接起来,否则您将不必要地禁止这些访问。)而且,赋值操作符必须<代码>返回*;< /代码>代码中缺少的内容。(也有一些东西,我认为是“相等的”运算符:<代码>布尔运算符==(const bStrue &)const ,它也可以重载。因此,我的NIT拾取……)在数学意义上,赋值和等式是相同的。纯函数语言正确地反映了这一点,也不区分这一点。C++是一种命令式语言(虽然它提取了一些功能性的技术)。在命令式语言中,赋值和等式是不同的。<代码> i=i+1;< /Cord>是数学无意义。(无穷大和-无穷大是我所知道的唯一可以解决这个方程的“数字”)但是,这是命令式语言中非常常见的语句,因为变量表示存储(但变量中不是符号),实际含义是iNew=iOld+1
;-)顺便说一句。我想知道你的编译器没有抱怨你的操作符=()
。我不确定该标准是否需要诊断,但我确信我在老化的VS2013中得到了诊断。(带有“并非所有代码路径都返回值”或类似内容的内容。)这可能是启用警告的问题。如果是这样,您应该启用更多警告。乍一看,它们可能看起来很烦人,但实际上,它们确实有助于在代码随时间增长时保持代码按预期运行。(对于U.B.而言,在编译器无法警告的语言中,仍然有足够的机会…)-)@Scheff这实际上是非常有用的,谢谢!现在回头看,我可以看到它是如何明显的赋值运算符以及两者之间的区别,谢谢。但是我很好奇,为什么它需要返回*这个?是因为它返回一个完整的二叉树吗在C++(以及C)中,赋值不是一个语句(像其他类似的语言,例如Pascal或BASIC),而是一个允许在表达式中使用的操作符。这使得例如链式(例如,<代码> A= B= C;< /代码>)以及任何其他用法都是左值。(例如(tree=otherTree).print();
)。因此,通常期望赋值运算符返回对其左侧的引用。(赋值运算符是少数几个右关联运算符之一。因此,a=b=c;
解析为a=(b=c);
其中(b=c)
返回对b
的引用,然后将其分配给a
)