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