当前位置: 首页 > 知识库问答 >
问题:

二进制搜索树删除方法

马边浩
2023-03-14

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

对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为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;
}

共有2个答案

韩宜春
2023-03-14

事情就是这样:

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-

我不知道该告诉您什么来修复它-正如一位评论者指出的那样,为什么您仍然想调用bst-

if (bst != NULL) cout << bst->right
牛景同
2023-03-14

您可以检查NULL(或nullptr):

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

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

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

 类似资料:
  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。 运行代码时得到的输出是: 移除90后的树。70 80 85 98 100 120 移除70. 80 85 98 100 120后的树 移除85后的树。80 98 100 120 移除98后的树。80 100 120 移除80后的树。100 120 移除120后的树。100 移除100后的树。100

  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 我正在尝试为我一直在研究的BST结构实现一个移除方法。以下是包含查找、插入和删除方法的代码: 我被告知可以使用insert方法来帮助我使用remove方法,但我只是不知道如何获取最小/最大的元素,然后用该值替换我正在删除的元素,然后递归地删除我获取替换值的节点,同时仍然保持O(logn)的复杂性。有人有什么想法或明显的漏洞我错过了,或任何其他有帮助的,因为我撞我的头在这个问题上? 编辑:我用答案的

  • 从二叉查找树中删除节点时,您可以将节点替换为左侧的最大子节点或右侧的最小子节点。 我很难理解以下实现执行删除操作的方式。 上面的代码包括以下步骤: < li >查找替换节点。 < li >让替换节点引用已删除节点的左右子节点。 < li >让已删除节点的左右子节点将替换节点作为父节点。 < li >让替换节点引用已删除节点的父节点作为自己的父节点。 < li >清理。 我有困难的部分特别是递归。据

  • 我正在尝试从二叉查找树中删除节点。我可以成功地删除树上的任何其他节点,除了一个特殊的情况。如果目标节点有两个子节点,左边的子节点有右边的子树,我可以定位正确的替换节点,并将值切换到目标节点,但替换节点永远不会被删除。 看看上面的图片,如果我尝试删除17,程序将正确地导航到13,并用13替换17,但它不会像预期的那样删除原来的13。 我附加了我的remove方法和其中引用的方法。 这是我的Node类