二叉树的后续非递归遍历

void TraverseTree(BTree BT)
{
    StackTree S;
    StackTag  tag;
    BTree p=BT;
    while (p!=NULL||!IsEmpty(S))
    {
        while (p)
        {
            push(S,p);
            push(tag,0);
            p=p->pLchild;
        }
        if (Top(S)->pRchild==NULL||Top(tag)==1)
        {
            BTree temp=Pop(S);
            Pop(tag);
            cout<<temp->element;
            p=NULL;
        } 
        else
        {
            Pop(tag);
            push(tag,1);
            p=Top(S)->pRchild;
        }
    }
}

二叉树后续非递归遍历基本思想:

(1)当树非空时,将指针p指向根节点,p为当前节点指针。

(2)当p压入栈s中,0压入栈tag中,并令p指向其左孩子

(3)重复执行步骤(2),直到p为空。

(4)如果tag栈中的栈顶元素为1,跳至步骤(6)。

(5)如果tag栈中栈顶元素为0,跳至步骤(7)。(用来表示还问访问右子树)

(6)将栈S的栈顶元素取出,并访问,弹出栈S和tag的栈顶元素,并另p=NULL,跳至步骤(8)。

(7)将p指向栈顶元素的右孩子,弹出栈tag的栈顶元素,再把1压入栈tag中。(用来标记从右子树返回)

(8)重复指向步骤(2)~(7),直到p为空并且栈s也为空。

(9)遍历结束。

 1 void PostOrder(BiTree BT){
 2     stack S;
 3     stack tag;
 4     BiTree p=BT;
 5     while(p!=NULL||!isEmpty(S)){
 6         while(p!=NULL){//直到左孩子为空
 7              push(S,p);//将p进栈
 8              push(0,tag);//表示p的右子树还未访问或者是从左子树返回
 9              p=p->lchild;//指向其左孩子
10         }
11         if(Top(tag)==1){//从右子树返回
12              p=Top(S);
13              printf("%c",p->data);
14              pop(S);
15              pop(tag);
16              p=NULL;
17         }else{//从左子树返回
18              p=Top(S);
19              if(!StackEmpty(S)){
20                  p=p->rchild;
21                  Pop(tag);
22                  Push(1,tag);
23              }
24         }
25     }
26 }
原文地址:https://www.cnblogs.com/GoAhead/p/2513663.html