二叉树迭代版的三种遍历
<span style="font-size:18px;">/**
这里是二叉树的各种遍历算法(迭代版非递归)
*/
#include "StructNode.h"
#include <stack>
template < typename T >
void PreTraverse(Node < T > *root) //先序遍历(迭代版)
{
stack < Node < T > * > s; //定义一个辅助栈
s.push( root );
cout << "先序遍历迭代版" << endl;
while (!s.empty()) //判断栈是否为空
{
root = s.top(); //top是或缺栈首的值
s.pop(); //pop是栈首出栈
cout << root->value << " ";
if (root->rChild != NULL) //先入右孩子后入左孩子,才能左孩子先出栈
{
s.push(root->rChild);
}
if (root->lChild != NULL)
{
s.push(root->lChild);
}
}
cout << endl;
}
template < typename T >
void MidTraverse(Node < T > *root) //中序遍历(迭代版)
{
cout << "中序遍历迭代版" << endl;
stack < Node < T > *> s; //辅助栈
while (true)
{
while (root)
{
s.push(root);
root = root->lChild; //左孩子入栈
}
if (s.empty()) //当辅助栈为空时
{
break; //跳出while
}
root = s.top(); //读取栈顶元素
cout << root->value << " ";
root = root->rChild;
s.pop(); //栈顶元素出栈
}
cout << endl;
}
template < typename T >
void AftTraverse(Node < T > * root)
{
cout << "后序遍历迭代版" << endl;
stack < Node < T > * > s; //定义一个辅助栈
Node < T > *preVisited = NULL; //用来指向前一个被访问的节点
while (true)
{
while (root)
{
s.push(root);
root = root->lChild; //左孩子入栈
}
if (s.empty())
{
break;
}
root = s.top();
//当前节点的右孩子如果为空或者已经被访问,则访问当前节点
if (root->rChild == NULL || root->rChild == preVisited)
{
cout << root->value << " ";
preVisited = root; //记录该节点,表示已经访问过
s.pop();
root = NULL;
}
else
{
root = root->rChild; //否则访问右孩子
}
}
cout << endl;
}</span>