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 }