C语言二叉树删除节点递归函数改为void类型的实现逻辑咨询
实现思路
原返回struct treeNode*的版本核心逻辑是将修改后的子树根节点返回给上层,完成父节点左/右指针的赋值。改为void返回类型时,通过二级指针可以直接修改上层父节点的左/右指针变量,不需要通过返回值传递修改结果,原逻辑中所有return对应的操作都可以转换为直接修改*root的指向。
完整实现代码
void removeElement(struct treeNode **root, int data) { // 空节点直接返回,原有处理逻辑正确 if(*root == NULL) return; if (data > (*root)->data) removeElement(&(*root)->right, data); else if(data < (*root)->data) removeElement(&(*root)->left, data); else { // 情况1:待删除节点是叶子节点,左右子节点都为空 if((*root)->left == NULL && (*root)->right == NULL) { free(*root); *root = NULL; // 直接修改上层对应指针为NULL } // 情况2:待删除节点只有一个子节点(你询问的分支) else if((*root)->left == NULL || (*root)->right == NULL) { struct treeNode *temp; // 保存存在的那一个子节点指针 if((*root)->left == NULL) temp = (*root)->right; else temp = (*root)->left; free(*root); // 释放待删除节点的内存 *root = temp; // 直接修改上层对应指针指向子节点,完成替换 } // 情况3:待删除节点左右子节点都存在 else { struct treeNode *temp = find_minimum((*root)->right); (*root)->data = temp->data; // 递归删除右子树中的重复最小节点 removeElement(&(*root)->right, temp->data); } } }
单孩子节点分支逻辑说明
你询问的分支核心是替代原代码中return temp的逻辑:
- 先拿到待替换的子节点指针存到
temp - 释放当前待删除节点的内存
- 直接修改
*root的指向为temp,因为*root本质就是上层父节点的左/右指针变量的地址解引用,修改后上层指针会直接指向新的子节点,不需要通过返回值传递结果。
调用该函数时需要传入根节点指针的地址,示例调用方式:removeElement(&root, 要删除的目标值);
内容的提问来源于stack exchange,提问作者Darke
相关产品推荐
相关产品推荐

