void PreOrder_2(BinTreeNode *p) //非递归前序遍历
{
stack < * > S;
while(p!=NULL || !S.empty())
{
while(p!=NULL)
{
cout<<p->data; //访问根结点
S.push(p);
p=p->leftChild; //遍历指针进到左子女结点
}
if(!S.empty()) //栈不空时退栈
{ p=S.top();
S.pop();
p = p->rightChild; //遍历指针进到右子女结点
}
}
}
template<class * >
void InOrder_2(BinTreeNode *p) //非递归中序遍历
{ stack* > S;
do{
while(p!=NULL) //遍历指针未到最左下的结点,不空
{
S.push(p);
p=p->leftChild;
}
if(!S.empty()) //栈不空时退栈
{ p=S.top();
S.pop();
cout<<p->data;
p=p->rightChild;
}
} while(p !=NULL || !S.empty());
}
template
void PostOrder_2(BinTreeNode *p) //非递归后序遍历
{
stack * > S;
stack tag;//定义一个新的栈用来保存tag域判别根结点的左右子树是否均遍历过
while(p != NULL || !S.empty()) //左子树经过结点加L进栈
{
while(p!=NULL)
{ S.push(p); //首先将t和tag为0入栈,遍历左子树
tag.push(0);//遍历左子树前的现场保护
p=p->leftChild;
}
while( !S.empty() && tag.top()==1)
{
p=S.top();
S.pop();
tag.pop();
cout<<p->data; //最后访问根结点。
}
if( !S.empty())
{
tag.pop();
tag.push(1);//遍历右子树前的现场保护,修改栈顶tag为1,遍历右子树
p=S.top(); // 取栈顶保存的指针
p=p->rightChild;
}