无法从二进制搜索树中删除叶子

Can not delete a leaf from binary search tree

本文关键字:删除 叶子 搜索树 二进制      更新时间:2023-10-16

我已经从二进制搜索树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 deleten";
      else if(deleted_node_address->left_ptr==NULL  &&  deleted_node_address->right_ptr==NULL)
      {
        cout<<"The element has no children, No linking requiredn";
        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=NULL;

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

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

此外,您调用return_node_address()函数将节点搜索到之前删除>您测试root==NULL。您确定return_node_address方法是否为无效 - ?