2016-11-24 97 views
1

我做了一个二叉树类,它保存: int值,BinaryTree* left,BinaryTree* rightC++二叉树递归析构问题

class BinaryTree { 
private: 
    int value; 
    BinaryTree* left; 
    BinaryTree* right; 
    bool isVisited; 
public: 
    BinaryTree(); 
    BinaryTree createComplete(int n); 
    ~BinaryTree(); 
} 

我的析构函数是:

BinaryTree::~BinaryTree() { 
delete left; 
delete right; 
} 

在克利翁它完美运行时,但在我的终端,我得到一个 段错误(核心转储)。我看到的每个地方都声称这应该是破坏者。任何阐述都会有所帮助!

我不是一个计算器专家,我更新了我的〜二叉树功能仍然得到段错误:

BinaryTree::~BinaryTree() { 
if (right != NULL) { 
    delete right; 
} 
if (left != NULL) { 
    delete left; 
} 

}

+1

你也可以显示构造函数的定义吗? –

+0

你如何建立你的BST?你能发布足够的代码,我们可以在我们的结尾重现这个问题吗? – templatetypedef

回答

2

所有目前执行的首先不是一个完整的树。 它是一个节点,因此我建议将它重命名为BinaryTreeNode并使用它来构造一个新的类BinaryTree,它跟踪根并允许递归释放树。

话虽如此,你的析构函数很可能是段错误,因为你一味地试图删除一个指针。

首先确保您将nullptr左右初始化。 然后你做if(left != nullptr) { delete left }

+0

'BinaryTree ::〜BinaryTree(){ \t if(right!= NULL){ \t delete right; \t} \t if(left!= NULL){ \t delete left; \t} }'更新了我的文件,仍然收到段错误 –

+0

您确定将它们设置为NULL吗?如果你没有,他们可能包含垃圾值,你的程序可能试图删除内存不允许触摸 – Makaronodentro

+0

首先,我很抱歉,这是我第一次或第二次使用stackoverflow,我做了初始化为NULL。再次,在CLion中它工作正常。在终端段错误。 –

0

没有看到你的构造函数,我假设你不初始化你的节点的孩子为NULL。这可能意味着底部叶子处的未初始化节点leftright在它们中具有随机值。当析构函数运行时,它将尝试释放节点中随机垃圾指向的内存。

尝试初始化您的子节点为NULL,当ctoring节点,然后检查它像monoceres建议。这也将是不错的设定指针NULLdelete后避免调试完毕,我注意到,每一个正确的孩子失去它的节点,而前序遍历会是罚款后erronous双delete

+0

我将节点的子节点初始化为null。 –

0

的情况下,但是当删除它时,问题的答案,感谢每一个帮助!