C++ 无法从二叉搜索树中删除叶
我从二元搜索树BST中创建了一个叶的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
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删除节点”并研究一些示例实现。当您熟悉了问题和可能的解决方案后,请再次浏览代码并找出其中缺少的部分。