算法通关村第七关——树前/中/后序遍历黄金挑战笔记

该部分内容是归纳总结,树前中后序遍历的迭代实现方法,思考迭代实现方法为什么这么写,如何与《树前/中/后序遍历白银挑战笔记》中递归调用图相互联系,递归方式是如何用迭代法进行模拟的。

更深一步了解树前中后序遍历的迭代实现和递归实现,同时补充树后序遍历的迭代实现新方法,该方法新颖、独到,与树先序遍历的迭代实现相互联系,更便于记忆,且大幅降低难度!

1.树前序遍历迭代实现

既然要模拟树前序遍历的递归实现方式,“栈”必不可少,其用来保存参数、局部变量

那么逻辑是什么?答:保存当前树节点的环境,进入左孩子进行访问

如何保存当前树节点的环境?答:压入栈中!

左孩子为空时,如何处理?答:左孩子为空,恢复原来保存的树节点环境,转而访问右子树。

如何回复原来保存的树节点环境?答:出栈!

厘清逻辑,我们就可以写出一段代码进行模拟了!

while(t != null){
    stack.push(t);
    res.add(t.val);
    t = t.left;
}
t = stack.pop();
t = t.right;

上面的代码就是一次简单模拟递归调用“保存环境、恢复环境”的过程!

很显然,我们需要进行多次“保存环境、恢复环境”的操作的过程!该怎么处理?答:将栈内保存的环境全部恢复(弹栈)即可!根据上面代码的最后两行,我们易得出弹栈的条件!!stack.isEmpty()或t != null(可理解成右子树存在)

厘清这一段逻辑,直接上代码,拿下树前序便利的迭代实现方式!

    public static List<Integer> mypPreOrderTraversal(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode t = root;
        while(!stack.isEmpty() || t != null){
            while(t != null){
                stack.push(t);
                res.add(t.val);
                t = t.left;
            }
            t = stack.pop();
            t = t.right;
        }
        return res;
    }

2.树中序遍历迭代实现

中序遍历和前序遍历的实现过程高度类似,只是记录序列顺序发生改变,由原来保存环境时记录序列顺序变成恢复环境时记录序列顺序。那么如何理解这句话呢?答:就是由先访问根节点变成先访问左子树在访问根节点。

厘清逻辑,直接上代码!

    public static List<Integer> myInorderTraversal(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode t = root;
        while(!stack.isEmpty() || t != null){
            while(t != null){
                stack.push(t);
                t = t.left;
            }
            t = stack.pop();
            res.add(t.val);
            t = t.right;
        }
        return res;
    }

3.树后序遍历迭代实现

树的后序遍历迭代实现,采用反转法。

该方法的由来如下,树的后序遍历序列为:95743

                                反转后序遍历序列为:34759

可以发现,反转的后序遍历序列就是变式的先序遍历序列(根右左)!先序遍历的迭代实现已经掌握了呀,那么后序遍历的迭代实现简直就是paper tiger!直接上代码!

    public static List<Integer> mypPostOrderTraversal(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode t = root;
        while(!stack.isEmpty() || t != null){
            while(t != null){
                stack.push(t);
                res.add(t.val);
                t = t.right;
            }
            t = stack.pop();
            t = t.left;
        }
        Collections.reverse(res);
        return res;
    }

OK,《算法通关村第七关——树前/中/后序遍历黄金挑战笔记》结束,喜欢的朋友三联加关注!关注鱼市带给你不一样的算法小感悟!(幻听)

再次,感谢鱼骨头教官的学习路线!鱼皮的宣传!小y的陪伴!ok,拜拜,第八关第一幕见!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值