如何解决前序遍历二叉树——迭代法
我正在实现二叉树的先序遍历(无递归)。以下代码陷入无限循环。我无法理解发生了什么
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;
}
解决方法
外循环永远不会退出:它的 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
没有赠送太多。 -
您需要输出一个空格来分隔不同的数据输出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。