我从二叉搜索树BST中创建了一个叶子的delete_node()
函数。以下是delete_node()
函数的行为:
否则,如果该叶子没有孩子,则不需要进一步授权。因此,指向该叶子的指针将被删除,然后使其指向null。但遗憾的是该计划已经崩溃
这是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;
}
}
答案 0 :(得分: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 ...?