C ++二叉树递归析构函数问题

时间:2016-11-24 17:59:15

标签: c++ recursion segmentation-fault binary-tree destructor

我创建了一个二叉树类,其中包含: int值,BinaryTree* leftBinaryTree* right

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

我的析构函数是:

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

在clion中运行时效果很好,但在我的终端中我得到了 段错(核心转储)。我看到的每个地方都声称这应该是析构函数。任何细化都会有所帮助!

我不是stackoverflow专家,我更新了我的~binaryTree函数仍然得到一个段错误:

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

}

3 个答案:

答案 0 :(得分:2)

首先,您当前的实现不是完整树的实现。 它是一个节点,因此我建议将其重命名为BinaryTreeNode并使用它来构造一个新的BinaryTree类,它跟踪根并允许您递归地解除分配树。

说过你的析构函数很可能是段错误,因为你是盲目地试图删除一个指针。

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

答案 1 :(得分:0)

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

尝试在节点关联时将子节点初始化为NULL,然后像建议的monoceres一样检查它。在NULL之后将指针设置为delete以避免错误的双重delete

的情况也是一件好事。

答案 2 :(得分:0)

所以在调试之后,我注意到每个孩子都失去了它的节点,这些节点在进行预订时进行遍历是正常的,但是在删除它时会产生问题,感谢每个人的帮助!