二叉搜索树删除方法

时间:2014-03-14 03:14:40

标签: c++ binary-search-tree

我在C ++中实现了二进制搜索树。

对于delete方法,除了最后一种情况外,一切都有效,当唯一的树是父树时,它指向两个空子节点。 现在的问题是: 我希望在删除子树后打印出与父级相同的左右子树。他们和父母都应该是NULL但是当我尝试输出这些值时,我得到STATUS_ACCESS _VIOLATION

以下是有问题的删除代码。 我希望删除父节点,并设置tree->left = tree->right = NULL.

void BST_delete(string key, BST & tree) { 
    if ((!BST_has(key, tree) || BST_isEmpty(tree))) {
        return;
    } else if (tree->key == key) {
        if (tree->right == NULL && tree->left == NULL) {
            tree = NULL;                      // <-- THIS IS IN QUESTION
        } else if (tree->left == NULL) {
        ...
            } ....
}

MAIN:

int main() {
    BST bst;
    BST_init(bst);
    BST_insert("a",bst);
    BST_print(bst);
    cout << endl;

    BST_delete("a",bst);
    BST_print(bst); // <-- doesnt print anything (which is right)
    cout << bst->right; //<-- Gives me error
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您可以检查NULL(或nullptr):

voit printNode(BSTNode* p) {
     cout << ( p==NULL ? "null" : *p);
}

if (bst != NULL) {
     cout << printNode(bst->right);
     cout << printNode(bst->left);
}

并将此检查添加到BST_print函数。

答案 1 :(得分:0)

这就是发生的事情:

BST_delete("a",bst);
// bst is NULL
BST_print(bst); // equivalent to BST_print(NULL)
cout << bst->right; // Gives an error, because you 
                    // can't access a member on a pointer that is NULL

最后一行就像说NULL->right,这没有意义。

我不确定该告诉您如何修复它 - 正如评论者指出的那样,为什么在删除bst->right后仍然想要致电bst?也许最好删除该行,或者执行:

if (bst != NULL) cout << bst->right