与正常的非递归中序遍历算法不同于两点:
一 比正常的中序遍历算法多了对数据元素的标记。
在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记,
还有访问完左子树利用gettop()获取双亲通过p=p->rchild进一步访问右子树(标记为1,表示访问了该数据元素的
右子树)时标记。
二 在访问完左子树时,中序遍历会pop出该元素,利用pop出数据访问右子树。而后序遍历在遍历完右子树之后才会pop
出该元素,并访问其数据,中间的过程是利用getTop函数实现的
void postOrderNoRe(BiTree T) //后续遍历非递归算法
{BiTree p;Stack *st;initstack(st);p=T;int Tag[20]; //栈,用于标识从左(0)或右(1)返回 while (p!=NULL || !isempty(st)){while (p!=NULL){push(st,p);Tag[st->top]=0;p=p->lchild;}while (!isempty(st)&&Tag[st->top]==1){//注意这里使用的是while,也就是说不停循环把栈里连续标记为1的节点都输出来//通过上面的函数访问完右子树之后才会访问该节点的数据//所以这个输出函数必须放在这里,下面的函数用来由访问左子树转//为访问其右子树。而上面的函数用来判断右子树是否访问结束p=pop(st);cout<<p->data<<" ";}if (!isempty(st)){p=gettop(st);p=p->rchild;Tag[st->top]=1; //设置标记右子树已经访问 }else break;}
}