【发布时间】:2015-12-22 10:18:45
【问题描述】:
我实现了一种算法,用于迭代地打印二叉树的后序遍历。整个算法都可以工作,只是它在到达树根时进入无限循环。
有人能指出我正确的方向吗?我已经被这个问题困扰了 2 天了。
void postorder_nonrec_2(treenode *root)
{
stack_t *s;
stack_init(&s, 100);
treenode *temp = root;
while(1)
{
while(root)
{
push(s, root);
root = root -> left;
}
if(stack_isEmpty(s))
break;
if(!top(s) -> right)
{
root = pop(s);
printf("%d ", root -> data);
if(root == top(s) -> left)
{
root = top(s) -> right;
}
else if(root == top(s) -> right)
{
printf("%d ", pop(s) -> data);
root = NULL;
}
}
else
{
root = top(s) -> right;
}
}
}
【问题讨论】:
-
如果您唯一的终止子句是“is_empty”,则显示“is_empty”的作用,否则我们无法判断......否则构造是无限循环的。此外,我们需要验证树是否正确形成。格式错误的树会导致正确的算法永远循环。
-
stack_isEmpty(stack *s)如果堆栈为空,则返回 true。 -
这似乎很明显,但是,如果堆栈是问题呢?从这里我们看不到。据我所知,除非正确触发,否则循环将永远持续下去。换句话说,你有没有使用调试器来查看程序卡在哪里循环?不是在调用stack_isEmpty吗?如果不是,它可能在上层循环中寻找一个最左边的节点,这暗示树本身可能是问题,但是为什么不推送泛滥内存(创建了巨大的堆栈)。如果正在调用 stack_isEmpty,那么为什么它永远不会返回 true?这些是我看到的唯一可能性
-
stack_isEmpty()已经过测试和调试。它没有问题。我所需要的只是一种方法来确定当前元素是根节点,并且已经遍历了整个树。然后我可以从堆栈中弹出根节点,打印它并自动停止循环。 -
这是函数:
int stack_isEmpty(stack_t *stack) { if(stack -> top == -1) return 1; return 0; }
标签: c algorithm data-structures binary-tree postorder