二叉搜索树代码

时间:2013-04-11 22:05:22

标签: c++ tree destructor binary-search-tree

想要为二进制搜索树编写析构函数(它应该删除树中的所有节点)这是我到目前为止所得到的

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;
}

我知道代码有问题,我该如何解决?

3 个答案:

答案 0 :(得分:3)

失去else s。否则,如果树有leftright不会被删除。

失去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;
}