C++ 无法从二叉搜索树中删除叶

C++ 无法从二叉搜索树中删除叶,c++,binary-tree,nodes,C++,Binary Tree,Nodes,我从二元搜索树BST中创建了一个叶的delete\u node()函数。下面是delete\u 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 d

我从二元搜索树BST中创建了一个叶的
delete\u node()
函数。下面是
delete\u 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;
  }
}
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;
    }

}
  • 如果二元搜索树为空,它将通知您它为空
  • 否则,该叶没有子级,因此不需要进一步的委托。因此,指向该叶的指针将被删除,然后使其指向null。但该程序不幸崩溃。
    以下是
    delete\u 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;
      }
    }
    
    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=NULL;
    
    清除
    deleted_node_address
    变量,该变量是
    BinarySearchTree::delete_node(float deleted_key)
    函数的本地变量,但它不清除父节点指向已删除节点的指针

    因此,您使树无效:它保留了一些
    left_ptr
    或一些
    right_ptr
    不为空,但指向非对象。因此,下次尝试访问指向的未使用内存时可能会发生崩溃


    此外,在测试
    root==NULL
    之前,调用
    return\u node\u address()
    函数搜索要删除的节点。你确定
    return\u node\u address
    method是空的root-proof…?

    是时候用调试器启动程序并逐行执行了。然后让它工作起来。通常是这样的。好吧,我会试试,但是上面代码中的任何逻辑都是错误的吗?为什么要投反对票?我想知道,为了改进我的问题,您从不检查
    已删除的节点\u地址
    是否为非空,因此这是一个很好的候选对象。您的意思是我应该将指向其父节点的已删除节点的指针设为指向空?“我说得对吗?”艾哈迈德说得对。删除子节点时,其父节点不再具有该子节点。“没有左孩子”或“没有右孩子”分别是
    left_ptr
    right_ptr
    NULL
    。@Ahmed您可能会在谷歌上搜索“从BST删除节点”并研究一些示例实现。当您熟悉了问题和可能的解决方案后,请再次浏览代码并找出其中缺少的部分。