我正在与树木合作,用于练习目的。目前精确二进制搜索树。我有一个通用Tree
类,用于解决BST问题。
因此,我遇到了一个问题,即将给定树(BST)转换为双链表。
我能够将树成功转换为DLL。但是,问题在于我打电话给destructor
。
因为,我正在为我的树的节点分配内存,我也希望释放内存。
这是Tree
class ::
~Tree() {
delete root;
root = NULL;
}
这是Node
class ::
~Node() {
delete left;
delete right;
left = NULL;
right = NULL;
}
所以,程序最终崩溃了! 据我所知,由于我编写的析构函数有点递归删除树的所有节点,当树转换为DLL时,左右指针确实指向彼此,因此,在调用析构函数时,析构函数尝试删除已删除的节点,并且该指针尚未设置为NULL。 我该如何克服这个问题?因为不允许析构函数重载。
有什么办法可以防止这个运行时错误? 这是代码:: http://ideone.com/SDkXY9 (Ideone没有打印输出,我不知道为什么!)
答案 0 :(得分:2)
这里的问题是你试图删除发起链式破坏的邻居。您将必须添加一个标志,您可以在析构函数中检查哪个邻居可以删除。
~Node() {
_isDestructing = true;
if (!left->_isDestructing) delete left;
if (!right->_isDestructing) delete right;
left = NULL;
right = NULL;
}