我正在实现一个从二叉搜索树中删除节点的功能。函数的原型已经设置好了,我也改不了,是学校作业。我的代码:
typedef struct tBSTNode {
char Key;
struct tBSTNode * LPtr;
struct tBSTNode * RPtr;
} *tBSTNodePtr;
void BSTDelete (tBSTNodePtr *RootPtr, char K) {
tBSTNodePtr *tmp;
if (*RootPtr != NULL) {
if (K < (*RootPtr)->Key)
BSTDelete(&(* RootPtr)->LPtr, K);
else if (K > (*RootPtr)->Key)
BSTDelete(&(* RootPtr)->RPtr, K);
else {
if ((* RootPtr)->LPtr == NULL) {
/* there is only right branch or none*/
tmp = RootPtr;
*RootPtr = (* RootPtr)->RPtr;
free(*tmp);
*tmp = NULL;
}
else if ((* RootPtr)->RPtr == NULL) {
/* there is only left branch or none*/
tmp = RootPtr;
*RootPtr = (* RootPtr)->LPtr;
free(*tmp);
*tmp = NULL;
}
else
/* there are both branches, but that is for another topic*/
}
}
}
此代码可以正常工作,以防没有分支连接到我要删除的节点。我预计*tmp = NULL;存在问题 行,我将地址丢失到分支的其余部分,但另一方面,如果不包括此行,我将得到一个 SEGFAULT,我正试图找出原因。
编辑:
好的,现在我知道错误在哪里了。这是愚蠢的错误,我应该使用tBSTNodePtr tmp; 而不是tBSTNodePtr *tmp;