You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:06