二叉树后序遍历的非递归实现

其核心思想就是每次的父节点都要入栈两次,确认其右儿子已经被访问过或者为空后才能被访问

void postOrder2 ( BTree t ) {
	
	// pcur 为当前访问的结点, plast 为上一个已经 print 的结点
    BTree stack[100];
    int top = -1;
    BTree pcur = t, plast = NULL;

    if ( !t ) {
        return;
    }

    while ( pcur ) {
        stack[++top] = pcur;
        pcur = pcur->leftChild;
    }

    while ( top >= 0 ) {
    	// 此时, pcur 是“最左边”的结点,如果他没有右节点或者右节点已经被访问了,就可以访问他
        pcur = stack[top]; 
        top--;
        if ( pcur->rightChild == NULL || plast == pcur->rightChild ) {
            printf("%d ", pcur->value);
            plast = pcur;
        }
        else {
        	// push pcur into stack again
            stack[++top] = pcur;
            pcur = pcur->rightChild;
            while ( pcur ) {
                stack[++top] = pcur;
                pcur = pcur->leftChild;
            }
        }
    }

    printf("\n");
}

Python solution

    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:
            return []

        s = []
        travel = []
        pcur = root
        plast = None

        while pcur:
            s.append(pcur)
            pcur = pcur.left

        while s:
            pcur = s.pop()
            if not pcur.right or plast == pcur.right:
                travel.append(pcur.val)
                plast = pcur
            else:
                s.append(pcur)
                pcur = pcur.right
                while pcur:
                    s.append(pcur)
                    pcur = pcur.left

        return travel
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值