二叉树后序遍历非递归算法

1、基本思路

Step1:向左下遍历,元素依次入栈,直到左孩子为空
Step2:弹出栈顶元素,若其右孩子为空或已访问,则访问该元素;否则对其右孩子结点重复step1、step2

2、伪代码
// 后序遍历非递归算法
void PostOrder(Bitree T) {
    InitStack(S);	 // 栈S用于记录遍历过程
    BiTree p = T, q; // p为遍历指针,q用于记录p的右孩子的访问情况,若无右孩子则为NULL,否则指向p的右孩子
    int flag;
	do {
        while(p) {	 // 一直向左下遍历
            Push(S,p);
            p = p->left;
        }
        flag = 1;
        q = NULL;
		Pop(S,p);
        while(!isEmpty(S) && flag) {
        /*q两个可能的取值,NULL或已访问结点,
        意味着当前结点p的右孩子要么为空要么已经访问,
        因此下一个访问的就是p结点*/
            if(p->rchild == q) {
                visit(p);	// 访问p结点
                q = p;		// 记录该结点
                Pop(S,p);
            } else {		// 说明p右孩子还未访问
                p = p->rchild;
                flag = 0;	// 以p(未访问结点)为根还需找到最左下结点,因此flag置为0,跳出循环
            }
        }
    } while(!isEmpty(S))
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值