Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C+中实现BST的复制构造函数和重载相等运算符+; 我需要用C++实现BST的各种功能。其中两种方法,复制构造函数和重载相等运算符,我对它们的确切逻辑以及如何将该逻辑转化为代码感到困惑_C++_Copy_Operator Overloading_Binary Search Tree - Fatal编程技术网

如何在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*

到目前为止,我认为逻辑应该是这样的:

  • 将调用复制构造函数,并使用equal重载运算符将复制树设置为本地树
  • equal重载方法逐步访问树的每个节点,并复制每个节点的确切属性,以便使树完全相同,这将有望产生深度复制
  • 这就是我迄今为止所尝试的

    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