二叉树的前序遍历、中序遍历与后序遍历一直是面试时的常客。这三种遍历方法都有递归实现与非递归实现两种版本。递归实现只需要根据定义书写即可,而非递归实现则会用到其他的数据结构,相对复杂。本文将这三种遍历方法的非递归实现加以总结,以备不时之需。
1.前序遍历
前序遍历的非递归版本需要用到一个栈,用以记录当前遍历节点的右子节点。回退时,获取栈顶节点,继续前序遍历。其c++实现如下所示:
void unrecur_preorder_traversal(node *head) //通过一个栈实现前序遍历,栈记录遍历过程中每一个节点的右子女节点
{
stack<node *> data;
node *p=head;
cout<<"前序遍历结果如下:"<<endl;
cout<<p->val<<" ";
do
{
if(!data.empty())
data.pop();
while(p!=nullptr)
{
if(p->right!=nullptr)
data.push(p->right);
p=p->left;
if(p!=nullptr)
cout<<p->val<<" ";
}
if(!data.empty())
{
p=data.top();
cout<<p-&g