我正在尝试完成删除功能
这是伪代码,注意结束。
我不知道伪代码是否错误。
以下是我对它的解释:
Node* minNode = Minimum(toDelete->right);
int tmp = 0;
tmp = minNode->val;
// delete(&tmp);
free(minNode);
minNode=NULL;
toDelete->val=tmp;
除非删除它,否则在打印时会开始填充一万亿个零。
我正在做的事情是否有意义? 我所拥有的其余代码是正确的,或者无论如何我都这么认为。它只会在这种情况下搞砸了。
这是最小功能
Node* BST::Minimum(Node *curr) {
// if (curr->left != NULL) {
// return(Minimum(curr->left));
// }
// return curr;
Node* node = curr;
while (node->left != NULL) {
node = node->left;
}
return node;
}
答案 0 :(得分:0)
您首先要搜索树,然后查看您要删除的节点是否存在。
如果它在那里,你想要检查三个外壳:
1:当您要删除没有子节点的节点时。 :在这种情况下,您只需删除所述节点,因为它没有任何子节点。
2:当你想删除一个左右子节点时 :在这种情况下,您将左或右子项设置为要删除的节点的父项
3:当您要删除包含两个子节点的节点时 :在这种情况下,您必须找到要删除的节点的后继者,然后将后继者与删除节点交换。
public Boolean delete(int key)
{
Node current = root;
Node parent = root;
//search for node here
while(current->key != key)
{
parent = current; //save the parent the nodes as you loop through it
if(key < current->key)
current = current->left
else
current = current->right
//if you do not find the key return false
if(current==null)
return false;
}
//case 1 start here:
//check if the said node has no child. in this case we are looking at current
if(current->left ==null && current->right == null)
{
//check if the node you want to delete is the root
if(current == root)
root = current
else
{
if(parent.key > current->key)
parent-left = null;
else
parent->right = null;
}
}//case 2 here:
//check to see if the node has either left or right child
else if(statement for checking left here)
{
//check for the case where your delete a root
//set the the parent of the current->left to be current->parent
}
else if(statement for checking right here)
{
//check for the case where your delete a root
//set the the parent of the current->right to be current->parent
}
else
{
//create a node successor and give it the successor you found
Node successor = findSuccessor(Node NodeToDel);
//check for root being the node you want to delete
if(root == successor)
root = successor;
else
{
//navigate left, set parent->left = successor
//navigate right, set parent->right = successor
//with the nature of the findSuccessor() algorithm i have,
//i will have to code one more line:
// give succeccor->left = current->left;
}
}
}
我希望这会有所帮助。