我试图在C++中将一个BST复制到另一个BST,但是不知道如何在前序遍历中进行。我在下面附上了一张图片,上面是我尝试过但没有成功的图片。我只是不断地抛出分段错误。我必须用我展示的两个函数来完成它。第一个函数是在public中,它调用了在private中的void副本。
BST::BST(const BST &obj):root{nullptr}
{
copy(obj.root);
}
void BST::copy(const TNodePtr Tree)
{
TNodePtr tempTree = new (nothrow) TNode;
tempTree = nullptr;
if (Tree == nullptr){
cout << "No elements in tree. " << endl;
}else if(Tree->left != NULL)
{
tempTree->element = Tree->element;
copy(Tree->left);
copy(Tree->right);
}
delete tempTree;
}
下面是提供的.H文件,无论如何都不能更改。
#pragma once // alternative Guard format
#include <string>
typedef std::string TElement;
struct TNode;
typedef TNode * TNodePtr;
struct TNode {
TElement element;
TNodePtr left, right;
};
class BST {
public: // exportable
// General description of each of the ADT operations/functions – exportable operations only
BST();
BST( const BST & );
~BST();
void insert( const TElement );
void remove( const TElement );
TNodePtr search( const TElement ) const;
void preView() const;
void inView() const;
void postView() const;
private: // non-exportable
// No private member documentation – implementation details are hidden/abstracted away
TNodePtr root;
void copy( const TNodePtr );
void destroy( TNodePtr & );
void removeNode( TNodePtr & );
void findMinNode( TNodePtr &, TNodePtr & );
void insert( const TElement, TNodePtr & );
void remove( const TElement, TNodePtr & );
TNodePtr search( const TElement, const TNodePtr ) const;
void preView( const TNodePtr ) const;
void inView( const TNodePtr ) const;
void postView( const TNodePtr ) const;
};
1条答案
按热度按时间fcg9iug31#
最大的问题是一个复制的函数必须返回那个副本,但是你的
copy
函数是void
,这就是为什么你不能让它工作。像这样的东西
编辑
显然,
copy
函数和类的签名通常是不可协商的。因此,我们将编写另一个执行真实的工作的函数,并从copy
调用该函数。如下所示这里我们使用了一个额外的函数
real_copy
,但是由于该函数不是类的一部分,并且是实现源文件的本地函数,因此不必编辑头文件。