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
相关产品推荐
相关产品推荐

