C语言二叉树递归插入后display无输出 指针传参相关疑问
二叉树代码问题排查
你的代码运行无输出的核心原因是二叉树除了根节点外,其余节点都没有正确挂载到树上,同时存在逻辑冗余问题,具体错误如下:
- 传参逻辑错误:C语言默认是值传递,你向
insert函数传入指针root1时,函数内修改的是指针的副本,不会修改原指针的指向。比如你递归调用insert(root1->left, value)时,函数内给root1赋值为新节点的地址,外层实际的root1->left不会发生任何变化,除了第一个根节点你修改了全局变量root,后续插入的12、2、55都没有接到树上。 - display函数逻辑冗余:递归遍历不需要加
while循环,你当前的while判断实际只会执行一次就return,虽然不影响运行但属于无效代码。 - insert逻辑冗余:混用全局根节点和参数节点,边界判断逻辑重复。
修正后的可运行代码
#include <stdio.h> #include <stdlib.h> typedef struct node { int val; struct node *left; struct node *right; } node; // 优化为返回新节点指针,避免二级指针的复杂度 node* insert(node *root1, int value) { // 空节点直接创建新节点返回 if(root1 == NULL) { node *temp = (node*)malloc(sizeof(node)); temp->val = value; temp->left = NULL; temp->right = NULL; return temp; } // 小于当前节点值插左子树 if(root1->val > value) { root1->left = insert(root1->left, value); } // 大于等于插右子树 else { root1->right = insert(root1->right, value); } return root1; } // 前序遍历输出 void display(node *root1) { if(root1 == NULL) { return; } printf("%d\n", root1->val); display(root1->left); display(root1->right); } int main() { node *root = NULL; root = insert(root, 4); root = insert(root, 12); root = insert(root, 2); root = insert(root, 55); display(root); // 补充:实际使用需要加节点释放逻辑避免内存泄漏 return 0; }
优化建议
- 尽量避免使用全局变量存储根节点,会降低代码的可维护性,也无法支持同时创建多棵二叉树。
- 插入逻辑除了返回新指针的写法,也可以用二级指针实现,比如函数签名改为
void insert(node **root1, int value),调用时传入&root即可。 - 测试完成后补充二叉树节点释放逻辑,避免内存泄漏。
指针传参疑问解答
- 你给出的示例中,
someFunct和sayHi里的nums存储的地址是完全相同的,你输出的两个地址值都是16也验证了这点。你只是通过指针修改了它指向的内存区域的内容(修改nums[2]的值),没有修改nums指针本身的指向,所以传一级指针就可以正常运行。 - 不是只有结构体传参才需要传指针的地址(
&ptr这种写法),只要你需要修改指针本身的指向的时候,就需要传二级指针。比如你原来的insert函数中需要让一个空指针指向新malloc的节点,本质是修改指针本身的值,这时候就需要传二级指针,或者用返回新指针的写法规避二级指针。如果你只是修改指针指向的内存内容,不需要修改指针本身的指向,传一级指针就足够。
内容的提问来源于stack exchange,提问作者meg
相关产品推荐
相关产品推荐

