c语言 - 预序树遍历有效,但后序无效



我有两个函数,它们遍历preorderpostorder中的树,每个函数将节点中的值插入到数组中,然后返回数组。

但是,我的postorder函数不起作用。调用函数时出现分段错误。

当编译并运行以下代码时,但在调用postorder方法后,我遇到了分段错误。

这是我的代码:

int* preorder_recursive(node *root, int* dataArray)
{
if (root == NULL)
return dataArray;
for (int i = 0; i < 512; i++)
{
if (dataArray[i] == INT_MIN)
{
dataArray[i] = root->data;
printf("%d is being inserted to the preorder array at pos %dn", root->data, i);
break;
}
}
preorder_recursive(root->left, dataArray);
preorder_recursive(root->right, dataArray);
}
int* postorder_recursive(node *root, int *dataArray)
{
if (root == NULL)
return dataArray;
postorder_recursive(root->left, dataArray);
postorder_recursive(root->right, dataArray);
for (int i = 0; i < 512; i++)
{
// any "empty" spots in the array should contain INT_MIN
if (dataArray[i] == INT_MIN)
{
dataArray[i] = root->data;
printf("%d is being inserted to the postorder array at pos %dn", root->data, i);
break;
}
}
}

呼叫时:

int * complete_pre_b = preorder_recursive(b, pre_order_b);
for(int i = 0; i < 3; i++)
{
printf("pre b is %dn", complete_pre_b[i]);
}
int * complete_post_b = postorder_recursive(b, post_order_b);
// here is the last print I see - code get till here fine
for(int i = 0; i < 3; i++)
{
printf("post b is %dn", complete_post_b[i]);
}

(注意-我有一个有3个节点的树,这就是为什么我循环从0到3(

问题出在哪里?我的帖子和预购有什么不同?

请注意,当complete_post_bmain的开头定义为:int* complete_post_b;时,您执行了:complete_post_b = postorder_recursive(b, post_order_b);

但是,在postorder_recursive中,不会返回任何数据。所以当分配给CCD_ 10时,它实际上是无效的。

你的for循环应该是:

for(int i = 0; i < 3; i++)
{
printf("post b is %dn", post_order_b[i]); // and not complete_post_b 
}

或者您可以返回dataArray并使用complete_post_b

对于感兴趣的部分:为什么它只发生在postOrder上

请注意,返回dataArray的唯一时间是节点为null时。我的猜测是,在这种情况下,返回值的寄存器将包含数据数组。当在函数末尾调用递归函数时,数据数组的地址会保留在寄存器中并向前传输,但你不能指望这一点,如果你想使用,你需要实际返回地址

相关内容

  • 没有找到相关文章

最新更新