- 后序遍历非递归化
只要在先序的时候把左右子树的位置颠倒一下即为逆后序
void postorderNonrecursion(BTNode *bt)
{
if (bt!=NULL)
{
BTNode *Stack1[maxSize]; int top1=-1;
BTNode *Stack2 [maxSize]; int top2=-1;
BTNode *p =NULL; //遍历指针
stackl[++topl] = bt;
while (top1 != -1)
{
p = Stack1[top1--];
Stack2[++top2] = p;
if (p->lChild != NULL)
Stackl[++top1] = p->lChild;
if (p->rChild != NULL)
Stack1[++top1] = p->rChild;
}
while (top2 !=-1)
{
p=Stack2[top2--];
Visit(p);
}
}
- 中序遍历非递归化
用栈,从根开始进栈,有左孩子就一直入栈,无左孩子出栈,看出栈元素是否有右孩子,有则进栈无继续出栈;左部全部进栈完再进右部(与左部同理)
void inorderNonrecursion (BTNode *bt)
{
if(bt != NULL)
{
BTNode *Stack[maxSize]; int top =-1;
BTNode *p=NULL;
p=bt;
while(top != -1 || p != NULL) //要考虑右子树的情况所以条件还要或p!=NULL
{
while(p != NULL)
{
Stack[++topl=p;
p = p->lChild;
}
if(top != -1)
{
p = Stack[top--];
Visit(p);
p =p->rChild;
}
}
}
}