我正在实现二叉树的先序遍历(无递归)。以下代码陷入无限循环。我无法理解发生了什么
void Tree::n_preorder()
{
Node* temp;
stack s;
cout<<"\nPreorder: ";
while(1)
{
s.push(root);
while(1)
{
temp = s.pop();
cout<<temp->data;
if(temp->right)
{
s.push(temp->right); //Push right child
}
if(s.isEmpty())
{
break;
}
if(temp->left)
{
s.push(temp->left); //Push left child
}
}
}
}
堆栈的isEmpty()函数
int isEmpty()
{
return top==-1;
}
答案 0 :(得分:1)
外循环永远不会退出:它的 while
条件始终为真,并且没有 break
。您拥有的唯一 break
会跳出内部循环,但不会跳出外部循环。
您不应该需要嵌套循环来执行此操作。当您只有一个循环时,如果不将左孩子放在堆栈上就中断它是没有意义的,因此请删除该条件中断,并将 !s.isEmpty()
作为循环的条件:
void Tree::n_preorder()
{
Node* node;
stack nodeStack;
cout << "\nPreorder:";
nodeStack.push(root);
while (!nodeStack.isEmpty())
{
node = nodeStack.pop();
cout << " " << node->data;
// As a stack is LIFO (last-in-first-out), we add the node's children
// on the stack in reversed order, so they get output in the correct order.
if (node->right)
{
nodeStack.push(node->right);
}
if (node->left)
{
nodeStack.push(node->left);
}
}
}
其他一些说明:
我觉得像“推左孩子”这样的评论没有用...因为那只是在重复——几乎是逐字逐句——人们已经可以在相应的代码行。应该对更高级别的抽象进行评论,并就“为什么?”给出一些解释。我在上面的代码中添加了这样的注释来说明这一点。
使用更具描述性的变量名称。 temp
和 s
没有赠送太多。
您需要输出一个空格来分隔不同的数据输出。