【问题标题】:Binary Search Tree can't delete the root二叉搜索树不能删除根
【发布时间】:2014-05-28 15:59:24
【问题描述】:

这个函数一切正常,但问题是我无法删除根,我无法弄清楚这里的错误是什么。我已经追踪了“其他部分”它工作正常,直到返回,它返回我不知道为什么的旧值。请帮忙!

node *removeNode(node *Root, int key) {

node *tmp = new node;

if(key > Root->value)
    Root->right = removeNode(Root->right,key);

else if(key < Root->value)
    Root->left = removeNode(Root->left, key);

else if(Root->left != NULL && Root->right != NULL) {
    node *minNode = findNode(Root->right);

    Root->value = minNode->value;

    Root->right = removeNode(Root->right,Root->value);
}

else {
    tmp = Root;

    if(Root->left == NULL)
        Root = Root->right;
    else if(Root->right == NULL)
        Root = Root->left;

    delete tmp;
}

return Root;

}

【问题讨论】:

  • 我可以说的第一件事是:如果左右为空怎么办?
  • 它进入else,然后它需要任何条件,不是吗?
  • 是的,它只是模棱两可(Root 等于 Root->就在返回之前)。我在您的代码中没有看到任何错误。您在调试会话期间打印了什么?
  • 如果我只插入“40”,然后尝试删除它,它不会被删除
  • 哦,谢谢这个修复它!

标签: c data-structures binary-search-tree


【解决方案1】:

改变

removeNode(Root, key);

Root = removeNode(Root, key); 

root 没有被 removeNode 修改,因为您传递了变量的副本。

【讨论】:

    【解决方案2】:

    使用这种样式,结果是新树,永远不要忘记更新根:

    Root = removeNode(Root, key);
    

    此外,必须测试一棵空树 (Root == NULL)

    node *removeNode(node *Root, int key) {
    
        if(Root == NULL) // Or if(!Root) return Root;
            return NULL;
    
        if(key > Root->value)
            Root->right = removeNode(Root->right,key);
        else if(key < Root->value)
            Root->left = removeNode(Root->left, key);
    
        else if(Root->left != NULL && Root->right != NULL) {
            node *minNode = findNode(Root->right); // Left most leaf
            Root->value = minNode->value;
            Root->right = removeNode(Root->right,Root->value);
        }
    
        else {
            node *found = Rppt;
            if(Root->left == NULL)
                Root = Root->right;
            else if(Root->right == NULL)
                Root = Root->left;
            delete found;
        }
    
        return Root;
    }
    

    替代风格:使用变量别名

    removeNode(&Root, key);
    
    void removeNode(node **ptr_var, int key) {
        node *ptr = *ptr_var;
        if (!ptr)
            return;
    
        if (key > ptr->value)
            removeNode(&ptr->right,key);
        else if(key < ptr->value)
            removeNode(&ptr->left, key);
    
        else if(ptr->left && ptr->right) {
            node **minNode = &ptr->right;
            while (*minNode) {
                minNode = &(*minNode)->left;
            }
            ptr->value = (*minNode)->value;
            delete *minNode;
            *minNode = NULL;
        }
        else {
            if(! ptr->left)
                *ptr_var = ptr->right;
            else if(!ptr->right)
                *ptr_var = ptr->left;
            delete ptr;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多