二叉树非递归后序遍历算法的一种简单思路

首先从简单的例子开始

1
2
3

上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123"
有什么发现?
后序遍历的倒序和前序的区别只是2和3的交换, 反映在算法中就是先左后右和先右后左的差别.
也就是说后序遍历的倒序就是按先右后左顺序的前序遍历.
所以我们只需要按先右后左顺序去前序遍历二叉树, 再将其结果颠倒就是正常后序遍历算法的结果.
而如果使用栈的话, 先入后出也就相当于颠倒了顺序.
根据上述思路就可以写出以下的非递归后序遍历算法

public void nonRecursivePostOrder(Node root){
        //用于保存访问顺序的List
        LinkedList<Node> reverse = new LinkedList<>();
        LinkedList<Node> stack = new LinkedList<>();
        Node pNode = root;
        while (null != pNode || !stack.isEmpty()) {
            if (pNode != null) {
                //与stack同步压入元素以保存访问顺序
                reverse.push(pNode);
                stack.push(pNode);
                //先走完右节点
                pNode = pNode.rightNode;
            }else {
                pNode = stack.pop();
                //再走左节点
                pNode = pNode.leftNode;
            }
        }
        //弹出并访问所有元素完成遍历.
        while (!reverse.isEmpty()){
            System.out.println(reverse.pop());
        }
    }

与递归后序遍历对比一下是否正确

public static void main(String[] args) {
        Node binary = new Node();
        int[] wait = {43, 61, 84, 21, 23, 1, 36, 73, 89, 35, 27, 28, 2, 8, 96, 283, 83};
        for (int i : wait) {
            binary.add(i);
        }
        //这里使用ArrayList方便打印查看结果
        ArrayList post = new ArrayList();
        ArrayList nonRecursivePre = new ArrayList();
        binary.postOrder(post);
        binary.nonRecursivePostOrder(nonRecursivePre);
        System.out.println("递归后序遍历:"+post);
        System.out.println("非递归后序遍历:"+nonRecursivePre);
    }

测试结果
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值