C 删除指针后打印指针会在括号之间打印null

C 删除指针后打印指针会在括号之间打印null,c,pointers,recursion,binary-search-tree,C,Pointers,Recursion,Binary Search Tree,我编写了一段代码,递归地查找树中最小的字符串并将其删除。但是,删除节点后打印树将返回null static char* findMinimum(TreeNodePtr treePtr){ if(treePtr->left == NULL){ printf("Minimum node is %s\n", treePtr->item); char * temp = treePtr->item; (treePtr)->item = NULL;

我编写了一段代码,递归地查找树中最小的字符串并将其删除。但是,删除节点后打印树将返回null

static char* findMinimum(TreeNodePtr treePtr){
  if(treePtr->left == NULL){
    printf("Minimum node is %s\n", treePtr->item);
    char * temp = treePtr->item;
    (treePtr)->item = NULL;
    return(temp);
  }
  else{
    findMinimum(treePtr->left);
  }
}
我认为这个函数可以工作,因为它删除最小值,即使使用不同的字符串。我应该写一个条件来确保空指针不会被打印吗?为了以防万一,这里还有打印功能:

static void printTree(TreeNodePtr treePtr) {
  if (treePtr != NULL) {
    level++;
    printTree(treePtr->left);
    printf(">%*s%s\n", level*5, "", treePtr->item);
    printTree(treePtr->right);
    level--;
  }
}

您正在删除最小的节点,而不更改其父节点的子节点。如果删除节点,还应将其父节点更改为指向NULL。请注意,将treePtr->item设置为NULL并不能实现这一点,因为treePtr->left指向一个TreeNodePtr,而不是它的item成员。

此函数

static char* findMinimum(TreeNodePtr treePtr){
  if(treePtr->left == NULL){
    printf("Minimum node is %s\n", treePtr->item);
    char * temp = treePtr->item;
    (treePtr)->item = NULL;
    free(treePtr->item);
    return(temp);
  }
  else{
    findMinimum(treePtr->left);
  }
}
没有道理

对于初学者来说,这部分或代码

  else{
    findMinimum(treePtr->left);
  }
不返回任何内容。因此,函数已经具有未定义的行为

也可以考虑这些语句

    (treePtr)->item = NULL;
    free(treePtr->item);
自由的召唤毫无作用

否则,当函数返回指向已删除字符串的指针时,将交换语句。同样,program将具有未定义的行为

此外,当最小字符串已被删除时,第二次调用该函数时,该函数的行为也不清楚

您必须动态创建函数返回的最小字符串的副本

我建议在不进行测试的情况下实现以下功能

static char * findMinimum( TreeNodePtr treePtr )
{
    if ( treePtr == NULL || treePtr->item == NULL ) return NULL;

    if ( treePtr->left == NULL || treePtr->left->item == NULL )
    {
        char *s = malloc( strlen( treePtr->item ) + 1 );
        strcpy( s, treePtr->item );

        free( treePtr->item );
        treePtr->item = NULL;

        return s;
    }
    else
    {
        return findMinimum( treePtr->left );
    }
}

我发现findMinimum函数中存在两个问题:

1如果在findMinimum中出现其他情况,您会返回什么?我猜您忘记添加退货:

静态字符*findMinimumTreeNodePtr{ iftreePtr->left==NULL{ printfMinimum节点是%s\n,treePtr->item; char*temp=treePtr->item; treePtr->item=NULL; freetreePtr->item; 返回温度; } 否则{ return findMinimumtreePtr->left;//添加了return } } 你的树是二叉搜索树吗?考虑在这种情况下发生的事情:

   root-node
   /       \ 
smallest   largest
    \
   not-smallest
您应该重新定义不是最小的节点,而是最小的节点

3.你为什么免费上网

treePtr->item=NULL; freetreePtr->item;
这样调用函数不是实现递归所必需的吗?到目前为止,我还不知道其他的方法。关于第二部分,我会解决的。编辑:刚刚意识到你的意思,whoops@Impasse正如我所写的,函数具有未定义的行为。如果第一个节点不包含最小字符串,那么控件将传递给下一个左节点,函数将不返回任何内容。2我想是的,你说的rehang是什么意思?3这毫无意义,我编辑了原始帖子。@僵局2,最小的节点不应该是root的左子节点-node@user3365922不,他是对的。“非最小”与“最小”字符串没有任何共同之处。@VladFrommosco您应该删除最小的节点,树在这种情况下会是什么样子?@user3365922他没有删除整个节点。他正在删除存储在节点中的字符串本身。假设父节点之一没有左子节点,您的代码应该删除父节点,那么如果存在右子节点呢?你是怎么处理的?另外,我猜项目必须是一个字符串,那么将其分配给NULL将做什么呢?