[英]Deletion in BST
我试图在二叉搜索树 (BST) 中执行删除,但在打印已删除的数组后出现分段错误。
treeNode *minVal(treeNode *root)
{
if(root == NULL || root->left==NULL)
return root;
else
minVal(root->left);
}
treeNode *deleteBST(treeNode *root,int value)
{
treeNode *tempNode;
if(value>root->value)
deleteBST(root->right,value);
else if(value<root->value)
deleteBST(root->left,value);
else
{
if(root->left==NULL)
{
tempNode = root->right;
free(root);
return tempNode;
}
else if(root->right==NULL)
{
tempNode = root->left;
free(root);
return tempNode;
}
else
{
tempNode = minVal(root->right);
root->value=tempNode->value;
root->right = deleteBST(root->right,tempNode->value);
}
}
return root;
}
大概deleteBST()
返回treeNode *
的要点是返回值指向(子)树的新根。 如果在原始根中发现删除的值,则新根将与原始根不同,因此需要某种更新根的方法。
这需要由该函数的调用者适当处理,包括在执行递归调用时该函数本身。 您的功能无法执行此操作。
当在树中找不到指定值时,您的函数也无法正确处理这种情况。 如果传递了这样的值,它最终将尝试取消引用空指针。
而您的功能执行的实际删除是完全不够的。 它释放找到值的节点,但它不会调整以该节点为根的子树以具有有效结构,并且它会为已删除节点的父节点留下一个(然后)无效的子指针。
从 BST 中删除的一般方案是这样的:
如果树的根R为空,则返回空; 除此以外,
如果要删除的值小于R的值,则将其从左子树中删除,并更新R的左指针指向左子树的新根; 除此以外,
如果要删除的值大于R的值,则将其从右子树中删除,并更新R的右指针指向右子树的新根; 除此以外,
要删除的值是R本身的值。 在这种情况下,
为此子树选择一个新根:
在R的子节点都不为空的情况下,适当地更新子树。 假设右子树的最小节点MR是选定的新根,则必须
免费R 。
返回子树的根(原始的或新的,视情况而定)
更新的工作代码附有对错误的评论。
treeNode *minVal(treeNode *root)
{
if(root == NULL || root->left==NULL)
return root;
else
return minVal(root->left);//1.returning a value is a must here
}
treeNode *deleteBST(treeNode *root,int value)
{
treeNode *tempNode;
if(root==NULL)//2.handling the base case
return NULL;
if(value>root->value)
return deleteBST(root->right,value);
else if(value<root->value)
return deleteBST(root->left,value);
else
{
if(root->left==NULL)
{
tempNode = root->right;
free(root);
return tempNode;
}
else if(root->right==NULL)
{
tempNode = root->left;
free(root);
return tempNode;
}
else
{
tempNode = minVal(root->right);
root->value=tempNode->value;
root->right = deleteBST(root->right,tempNode->value);
return root;//can be skipped
}
}
return root;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.