使用两个堆栈的C BST后序遍历
我试图通过使用两个堆栈以迭代方式进行后序遍历,但没有效果 我不知道为什么它不能推入从第一个堆栈弹出的节点的第二个堆栈 编辑:添加了推送和弹出实现。如果需要更多细节,请告诉我,谢谢。不确定为什么我不能将弹出的节点推入另一个堆栈,尽管我可以将初始节点推入S1 完整代码:使用两个堆栈的C BST后序遍历,c,C,我试图通过使用两个堆栈以迭代方式进行后序遍历,但没有效果 我不知道为什么它不能推入从第一个堆栈弹出的节点的第二个堆栈 编辑:添加了推送和弹出实现。如果需要更多细节,请告诉我,谢谢。不确定为什么我不能将弹出的节点推入另一个堆栈,尽管我可以将初始节点推入S1 完整代码: printf(“%d”,pop(S2))。我认为pop()返回指向BSTNode的指针。您可能需要打印弹出的值item@kuro问题是我似乎无法推动(S2,弹出的项目);“无法推动”并不能清楚地描述您所观察到的问题。请提供准确的预
printf(“%d”,pop(S2))代码>。我认为pop()
返回指向BSTNode的指针。您可能需要打印弹出的值item@kuro问题是我似乎无法推动(S2,弹出的项目);“无法推动”并不能清楚地描述您所观察到的问题。请提供准确的预期行为和实际行为。@dikolav150然后您能分享push()
和pop()
的函数实现吗?或者像@kaylum所说的,一个最小的例子是最好的push(S2,popped_项)代码>考虑这一点:“代码> S2 < /代码>的值是什么?使用调试器。使用正确的工具可以更容易地找到这些东西。调试器将立即告诉您哪行代码触发了崩溃,以及变量值是什么。也可以单步执行代码。这些是基本的调试步骤。printf(“%d”,pop(S2))代码>。我认为pop()
返回指向BSTNode的指针。您可能需要打印弹出的值item@kuro问题是我似乎无法推动(S2,弹出的项目);“无法推动”并不能清楚地描述您所观察到的问题。请提供准确的预期行为和实际行为。@dikolav150然后您能分享push()
和pop()
的函数实现吗?或者像@kaylum所说的,一个最小的例子是最好的push(S2,popped_项)代码>考虑这一点:“代码> S2 < /代码>的值是什么?使用调试器。使用正确的工具可以更容易地找到这些东西。调试器将立即告诉您哪行代码触发了崩溃,以及变量值是什么。也可以单步执行代码。这些是基本的调试步骤。
void postOrderIterativeUsingTwoStacks(BSTNode *root)
{
Stack *S;
Stack *S2;
BSTNode *current = root;
push(S, current);
while(!isEmpty(S))
{
BSTNode *popped_item = pop(S);
printf("works\n");
push(S2,popped_item);
printf("doesn't work\n");
push(S, popped_item->left);
push(S, popped_item->right);
}
while(!isEmpty(S2))
{
printf("%d ", pop(S2));
}
}
void push(Stack *stack, BSTNode * node)
{
StackNode *temp;
temp = malloc(sizeof(StackNode));
if (temp == NULL)
return;
temp->data = node;
if (stack->top == NULL)
{
stack->top = temp;
temp->next = NULL;
}
else
{
temp->next = stack->top;
stack->top = temp;
}
}
BSTNode * pop(Stack * s)
{
StackNode *temp, *t;
BSTNode * ptr;
ptr = NULL;
t = s->top;
if (t != NULL)
{
temp = t->next;
ptr = t->data;
s->top = temp;
free(t);
t = NULL;
}
return ptr;
}