想要为二进制搜索树编写析构函数(它应该删除树中的所有节点)这是我到目前为止所得到的
virtual ~BST() {
BSTNode<Data>* node = root;
if (node == NULL){
return;
}else if (node->left) {
while(node->left){
delete node;
}
}else if (node->right){
while(node->right)
delete node;
}
isize = 0;
}
我知道代码有问题,我该如何解决?
答案 0 :(得分:3)
失去else
s。否则,如果树有left
。 right
不会被删除。
失去while
。节点应该有自己的析构函数,并且应该递归删除。
最后失去了if
。因为删除NULL有效。
virtual ~BST() {
BSTNode<Data>* node = root;
if (node == NULL){
return;
}
delete node->left;
delete node->right;
isize = 0;
}
答案 1 :(得分:3)
void BST::deleteNode(BSTNode<Data> *node) {
if (node) {
deleteNode(node->left);
deleteNode(node->right);
delete node;
}
}
BST::~BST() {
deleteNode(root);
}
答案 2 :(得分:1)
当你这样做时。
while(node->left){
delete node;
}
您删除了节点,但实际上并没有循环到下一个节点。因此,下一次循环node
将不会是NULL
,因此您取消引用未分配的数据结构,这是未定义的行为,并可能导致崩溃。然后你尝试再次删除相同的node
,这仍然是未定义的行为,并且肯定会导致崩溃。
您也不会删除两个左侧和右侧节点,其中只有一个节点归因于else
。
我建议你在BSTNode
中放一个正确的析构函数来删除自己的孩子:
template<typename T>
BSTNode<T>::~BSTNode()
{
delete left;
delete right;
}
然后树的析构函数就是:
BST::~BST()
{
delete root;
}