【问题标题】:Binary Search Tree Delete Method二叉搜索树删除方法
【发布时间】:2014-04-19 04:21:35
【问题描述】:

我已经用 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) {
        ...
            } ....
}

主要:

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

【问题讨论】:

  • 您是否尝试过使用调试器
  • OT:您应该考虑以 BST 成员的身份实现这些功能。
  • @wonce,实际上,目前正在纠正,至少如果我的一些证据使我得出正确的结论的话。
  • 我不明白你MAIN,你在BST_delete(bst = NULL)中删除了bst,你为什么还要bst-&gt;right

标签: c++ binary-search-tree


【解决方案1】:

您可以检查 NULL(或 nullptr):

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

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

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

【讨论】:

  • 如果父级为空(如问题中所示),检查其right 成员不会太顺利。
【解决方案2】:

这是正在发生的事情:

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-&gt;right,没有意义。

我不知道该告诉你什么来修复它 - 正如评论者指出的那样,你为什么在删除 bst 后仍想打电话给 bst-&gt;right?也许最好删除该行,或者这样做:

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

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多