【问题标题】:Can not delete a leaf from binary search tree无法从二叉搜索树中删除叶子
【发布时间】:2018-03-04 08:10:30
【问题描述】:

我从二叉搜索树 BST 中创建了一个叶子的 delete_node() 函数。以下是delete_node() 函数的行为:

  1. 如果二叉搜索树为空,它将通知您它为空。
  2. 否则,如果该叶子没有子节点,则不需要进一步的委托。因此,指向该叶子的指针被删除,然后使其指向空。但是程序不幸崩溃了。
    这是delete_node() 函数:

    void  BinarySearchTree :: delete_node(float deleted_key)
    {
      Node* deleted_node_address = return_node_address(deleted_key);
    
      if(root == NULL) cout<<"The tree is empty, No thing to delete\n";
    
      else if(deleted_node_address->left_ptr==NULL  &&  deleted_node_address->right_ptr==NULL)
      {
        cout<<"The element has no children, No linking required\n";
        delete deleted_node_address;
        deleted_node_address = NULL;
      }
    }
    

这是return_node_address函数:

Node* BinarySearchTree  ::return_node_address(float req_key,Node *traverse_ptr)
{
    if(traverse_ptr==NULL)
    {
        cout<<"There is no data to return its addres";
        return NULL;
    }
    else if(traverse_ptr->key  ==  req_key)
    {
        return traverse_ptr;
    }
    else if(req_key  <  traverse_ptr->key  && traverse_ptr->left_ptr != NULL)
    {
        return_node_address(req_key, traverse_ptr->left_ptr );
    }
    else if(req_key  >  traverse_ptr->key  && traverse_ptr->right_ptr!= NULL)
    {
        return_node_address(req_key, traverse_ptr->right_ptr);
    }
    else
    {
        cout<<"The Key You Entred Is Not Found in The Tree";
        return NULL;
    }

}

【问题讨论】:

  • 是时候使用调试器启动程序并逐行执行了。
  • 然后让它工作。通常是这样。
  • 好吧,我试试,但是上面代码中的逻辑有错吗?
  • 为什么要投反对票?我想知道以改善我的问题
  • 你永远不会检查 deleted_node_address 是否为非空,所以这是一个很好的候选者

标签: c++ binary-tree nodes


【解决方案1】:

任务

deleted_node_address=NULL;

清除deleted_node_address 变量,它是BinarySearchTree :: delete_node(float deleted_key) 函数的本地变量,但它确实从其父节点清除指向已删除节点的指针。

因此,您使树无效:它仍然存在一些 left_ptr 或一些 right_ptr 不是 NULL 但指向非对象。因此,下次尝试访问指向的未使用内存时可能会崩溃。

此外,您调用return_node_address() 函数来搜索要删除的节点您测试root==NULL。你确定 return_node_address 方法是 NULL-root-proof...?

【讨论】:

  • 您的意思是我应该使从其父节点指向已删除节点的指针指向null?我说的对吗?
  • @Ahmed 没错。当您删除子节点时,其父节点不再具有该子节点。而“没有左孩子”或“没有右孩子”恰好分别是left_ptrright_pttrNULL
  • @Ahmed 您可能会在谷歌上搜索“从 BST 中删除节点”并研究一些示例实现。当您熟悉问题和可能的解决方案后,再次浏览您的代码并找出其中缺少的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2013-11-21
相关资源
最近更新 更多