从二进制搜索树中删除所有叶节点的功能

时间:2016-10-19 05:40:08

标签: binary-search-tree

我想要求对该功能进行更正。问题是它删除了比叶子更多的节点。意味着它首先删除所有叶子,然后删除刚刚创建的叶子。 请告诉我如何纠正它。 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);
        }
    }
}

1 个答案:

答案 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
}