Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制搜索树代码_C++_Tree_Destructor_Binary Search Tree - Fatal编程技术网

C++ 二进制搜索树代码

C++ 二进制搜索树代码,c++,tree,destructor,binary-search-tree,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){

想要为二叉搜索树编写一个析构函数,它应该删除树中的所有节点,这就是我到目前为止得到的结果

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;
}
但我知道代码有问题,当您这样做时,我如何修复它

while(node->left){
    delete node;
}
删除节点,但实际上不循环到下一个节点。因此,循环中的下一次节点将不会为NULL,因此您取消引用未分配的数据结构,这是未定义的行为,可能会导致崩溃。然后再次尝试删除相同的节点,这仍然是未定义的行为,很可能会导致崩溃

您也不会同时删除左侧和右侧节点,只会删除其中一个节点(由于其他节点)

我建议您在BSTNode中放置一个适当的析构函数,删除它自己的子节点:

template<typename T>
BSTNode<T>::~BSTNode()
{
    delete left;
    delete right;
}
丢了埃尔斯。否则,如果树已经离开。权利将不会被删除

浪费时间。节点应该有自己的析构函数,并且应该递归删除

最终失去了国际单项体育联合会。因为delete NULL是有效的

virtual ~BST() {
  BSTNode<Data>* node = root;
  if (node == NULL){
    return;
  }  
  delete node->left;
  delete node->right;
  isize = 0;
}

向我们展示BST类和BSTNode类。这可能只会删除根的直接子级,也就是说,树的其余部分将处于未知状态。对,这就是我所想的,但是我需要一个删除所有子级的类nodes@JoachimPileborg是的,现在还不清楚他是如何实现BST和BSTNode之间的关系的。我请他来,但他没有。我在这里假设,由于他在节点中有左和右,这些节点也有左和右。我的意思是BST只是一个实际的树结构的包装。但我还是不确定。这可能是错误的。这就是为什么我向他提到节点应该有自己的析构函数并递归删除。@AndyT所以当所有节点都被删除时,大小可以设置为0,因为树中有0个节点,我可能错了though@cloud9resident:谁在乎它是否是析构函数的最后一行?这会递归删除所有节点吗,不仅仅是直接节点?@cloud9resident是的这看起来会正确删除所有子节点。
virtual ~BST() {
  BSTNode<Data>* node = root;
  if (node == NULL){
    return;
  }  
  delete node->left;
  delete node->right;
  isize = 0;
}
void BST::deleteNode(BSTNode<Data> *node) {
    if (node) {
        deleteNode(node->left);
        deleteNode(node->right);
        delete node;
    }
}

BST::~BST() {
    deleteNode(root);
}