先序遍历非递归:
void PreOrder_NonRecursion(TNode* &T)
{
Stack S;
InitStack(S);
if(T!=NULL)
{
Push(S,T);
}
while(StackEmpty(S)!=true)
{
Pop(S,T);
visit(T);
if(T->rchild!=NULL)
{
Push(S,T->rchild);
}
if(T->lchild!=NULL)
{
Push(S,T->lchild);
}
}
}
先序非递归遍历算是最简单的了。注意一个问题就是栈顶结点出栈的时候,先入右孩子,再入左孩子,因为对左孩子的访问要先于右孩子,后入栈的先出栈访问。
我之前就老想着一直把左孩子压进栈,但是出栈的时候就有问题了。
1
/ \
2 4
/ \
3 5
栈头:1
栈头:4 2
栈头:4 5 3
栈头:4 5
栈头:4
中序遍历非递归(天勤):
void InOrder_NonRecursion(TNode* &T)
{
Stack S;
InitStack(S);
TNode* p=T;
while(p!=NULL||StackEmpty(S)!=true)
{
while(p!=NULL)//这里用if也可以?
{
Push(S,T);