树迭代法的后序遍历
Postorder Traversal of Tree iterative method
我正在尝试使用迭代方法使用 2 个堆栈实现树的后序遍历。我已经实现了正确的算法。但仍然没有得到输出,出现错误,分段错误(核心已转储)。
谁能告诉我哪里做错了?
void postorder_iterative(struct node *root)
{
struct node *stack1[15],*stack2[15];
int top1=-1,top2 =-1;
root = stack1[++top1];
while(top1>=0)
{
root = stack1[top1--];
stack2[++top2] =root;
if(root->left != NULL)
stack1[++top1] = root->left;
if(root->right != NULL)
stack1[++top1] = root->right;
}
while(top2>=0)
printf("%c\t",stack2[top2--]->data);
}
在循环的第一次迭代中,您正在使用此语句读取未定义的值:
root = stack1[top1--];
第一个堆栈元素未定义,因为您从未对其进行初始化。 应该 在这里初始化:
root = stack1[++top1];
但这并没有将任何东西放入堆栈。相反,它会用未定义的值覆盖 root
。
应该是反过来的:
stack1[++top1] = root;
这解决了问题。
不要忘记在打印列表后打印换行符,所以什么都没有 。
我正在尝试使用迭代方法使用 2 个堆栈实现树的后序遍历。我已经实现了正确的算法。但仍然没有得到输出,出现错误,分段错误(核心已转储)。 谁能告诉我哪里做错了?
void postorder_iterative(struct node *root)
{
struct node *stack1[15],*stack2[15];
int top1=-1,top2 =-1;
root = stack1[++top1];
while(top1>=0)
{
root = stack1[top1--];
stack2[++top2] =root;
if(root->left != NULL)
stack1[++top1] = root->left;
if(root->right != NULL)
stack1[++top1] = root->right;
}
while(top2>=0)
printf("%c\t",stack2[top2--]->data);
}
在循环的第一次迭代中,您正在使用此语句读取未定义的值:
root = stack1[top1--];
第一个堆栈元素未定义,因为您从未对其进行初始化。 应该 在这里初始化:
root = stack1[++top1];
但这并没有将任何东西放入堆栈。相反,它会用未定义的值覆盖 root
。
应该是反过来的:
stack1[++top1] = root;
这解决了问题。
不要忘记在打印列表后打印换行符,所以什么都没有