0

我正在实现一个从二叉搜索树中删除节点的功能。函数的原型已经设置好了,我也改不了,是学校作业。我的代码:

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;

4

2 回答 2

1

您在使用指针时遇到问题。如果我们有sometype *ptr,我们检查这个 ptr 是否涉及我们写的一些空间(ptr!=NULL)*ptr指的是值本身,例如您的结构。阅读有关 C 中指针类型的更多信息。

于 2012-11-05T09:31:42.403 回答
0

你的删除逻辑是错误的

 if ((* RootPtr)->LPtr == NULL) {
                /* there is only right branch or none*/
                tmp = RootPtr;
                *RootPtr = (* RootPtr)->RPtr;
                free(*tmp);
                *tmp = NULL;
            }

在此代码中,您正在删除所需的节点,但不添加该节点的子根

 if ((* RootPtr)->LPtr == NULL) {
                /* there is only right branch or none*/
                tmp = RootPtr;
                *RootPtr = (* RootPtr)->RPtr;
                free(*tmp);
                *tmp = NULL;
                insert(RootPtr);  //insert the child node again in the tree
            }
于 2012-11-05T09:24:31.887 回答