我正在编写一些代码以从AVL树中删除。这是一个有助于删除的示例函数:
int AVL::getLargestAndTrim(Node*& currentNode, Node* parentNode) {
if (currentNode->right == nullptr) {
int returnData = currentNode->data;
parentNode->right = currentNode->left;
delete currentNode;
return returnData;
}
else {
Node* rightChild = currentNode->right;
return this->getLargestAndTrim(currentNode->right, currentNode);
}
}
该代码一直失败,消息“称为纯虚方法” 在没有活动异常的情况下终止调用“。
现在,如果我更换行
return this->getLargestAndTrim(currentNode->right, currentNode);
与
return this->getLargestAndTrim(rightChild, currentNode);
它工作正常。怎么样?
编辑: Node类定义为:
class Node {
public:
Node() {}
Node(int data) : data(data) {}
~Node() {}
private:
int data = 0;
Node* left = nullptr;
Node* right = nullptr;
int height = 0;
friend class AVL;
};
答案 0 :(得分:1)
你的序列
parentNode->right = currentNode->left;
delete currentNode;
错了。由于currentNode
是对parentNode->right
的引用,因此当您进行该分配时,它会更改currentNode
的值,然后删除currentNode->left
中的内容,同时使用悬空指针树指向已删除的数据。
稍后,当为删除的对象调用析构函数时,您将收到错误。