二叉树的后续非递归遍历

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 }

你可能感兴趣的:(二叉树)