我想要求对该功能进行更正。问题是它删除了比叶子更多的节点。意味着它首先删除所有叶子,然后删除刚刚创建的叶子。 请告诉我如何纠正它。 Leaf =没有子节点的节点。
typedef struct node {
int key;
node* left;
node* right;
}node;
void BST::DeleteLeafs()
{
if (root == nullptr)
throw InvalidOperationException();
else
deleteLeavesHelper(nullptr, root);
}
void BST::deleteLeavesHelper(node* parent, node* n)
{
if (n == nullptr)
return;
else
{
if (n->left == nullptr && n->right == nullptr)
{
n = nullptr;
if (parent != nullptr)
{
parent->left = nullptr;
parent->right = nullptr;
}
}
else
{
deleteLeavesHelper(n, n->left);
deleteLeavesHelper(n, n->right);
}
}
}
答案 0 :(得分:0)
你写道:
if (n->left == nullptr && n->right == nullptr)
{
n = nullptr;
if (parent != nullptr)
{
parent->left = nullptr;
parent->right = nullptr;
}
}
有一个问题,你应该释放n
的内存,否则你会有内存泄漏。 n=nullptr;
完全没用。
另一个问题是,您将指向parent
的两个孩子的指针无效。相反,您只需要使指向正确子项的指针无效:
if (n->left == nullptr && n->right == nullptr) {
if (parent != nullptr) {
if (parent->left == n)
parent->left = nullptr;
else if (parent->right == n)
arent->right = nullptr;
else
// raise some exception
}
// deallocate n
}