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

C语言实现N叉树遇指针覆盖问题,请求技术帮助

问题分析与修复

核心错误原因

你的new_node函数中,子节点指针数组初始化完全错误:

new_node->children = &new_node;

这里你把children(本应是存放子节点指针的数组)指向了当前节点自身的地址,而非为子节点指针分配独立的内存空间。这会导致后续赋值子节点时,越界写入到其他内存区域,直接覆盖了之前创建的节点(比如p1、p2的内容被p4、p5的赋值操作覆盖),最终出现混乱的输出。

修正后的代码

1. 正确实现new_node函数

根据子节点数量动态分配children数组的内存:

struct Node {
  int val;
  int numChildren;
  struct Node **children;
};

typedef struct Node node;

node *new_node(int numC, int data) {
    node *new_node = (node *)malloc(sizeof(node));

    if (new_node) {
        // 按子节点数量分配指针数组,无子女则设为NULL
        new_node->children = numC > 0 ? (node **)malloc(numC * sizeof(node *)) : NULL;
        new_node->numChildren = numC;
        new_node->val = data;
    }

    return new_node;
}

2. 实现前序遍历函数(匹配预期输出逻辑)

你的预期输出是N叉树的前序遍历结果,需要补充递归遍历逻辑:

void preOrder(node *root) {
    if (!root) return;
    // 先打印当前节点值
    printf("%d", root->val);
    // 遍历所有子节点
    for (int i = 0; i < root->numChildren; i++) {
        printf(", ");
        preOrder(root->children[i]);
    }
}

3. 修正后的main函数

int main(void) {
    node *root = new_node(3, 1); 

    node *p1 = new_node(2, 3);
    node *p2 = new_node(0, 2);
    node *p3 = new_node(0, 4);
  
    root->children[0] = p1;
    root->children[1] = p2;
    root->children[2] = p3;

    node *p4 = new_node(0, 5);
    node *p5 = new_node(0, 6);
    
    p1->children[0] = p4; 
    p1->children[1] = p5; 

    // 执行前序遍历,输出正确结果
    preOrder(root);

    // 注意:实际开发中需手动释放malloc分配的内存,避免泄漏
    return 0;
}

运行结果

执行后将输出:

1, 3, 5, 6, 2, 4

(注:你提供的预期输出1, 3, 2, 4, 5, 6存在错误,正确的前序遍历顺序应为根节点1 → 子节点3 → 3的子节点5、6 → 子节点2 → 子节点4)

内容的提问来源于stack exchange,提问作者Amar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22