二叉树代码框架对比

将二叉树的递归代码框架中的两种情况对比。一种是先递归左子节点,另外一种是先递归右子节点。
将从代码框架内容和输出顺序以及使用场景两个方面进行对比。

注:leetcode刷题的学习源于https://labuladong.gitee.io/algo/

代码框架对比

一般的二叉树的代码框架

    public void leftFirst(TreeNode root) {
        if (root == null) return;
        //前序遍历的位置
        leftFirst(root.left);
        //中序遍历的位置
        leftFirst(root.right);
        //后序遍历的位置
    }

这种情况即先对左子节点递归的情况。
这种情况在代码中的三个位置即二叉树中使用的前序遍历、中序遍历以及后序遍历的概念。在三处的输出顺序如下:

位置输出顺序
位置一前序遍历:根节点——>左子节点——>右子节点
位置二中序遍历:左子节点——>根节点——>右子节点
位置三后序遍历:左子节点——>右子节点——>根节点

注意:无论在哪个位置,对节点的操作都是使用root。在中序位置时,用的root,其实就是左子节点。因为在前一句传入的是root.left

修改后的代码框架(先递归右子节点)

    /**
     * 先递归右子节点的
     */
    public void rightFirst(TreeNode root) {
        if (root == null) return;
        //位置一
        rightFirst(root.right); 
        //位置二
        rightFirst(root.left);
        //位置三
    }

这种情况下是先对右子节点递归。
注意此时代码中的三个位置并不是二叉树中前序遍历、中序遍历以及后序遍历的概念,二者没有关系。
三个位置上对应的输出顺序如下:

位置输出顺序
位置一输出顺序:根节点——>右子节点——>左子节点
位置二输出顺序:右子节点——>根节点——>左子节点
位置三输出顺序:右子节点——>左子节点——>根节点

**总结:**因为在二叉树的遍历定义中,以根节点的输出顺序定义的,而且左子节点永远在右子节点前。因此与先递归左子节点的代码框架的三个位置一一对应。
在先递归右子节点的,就是将左右子节点的位置调换一下。

使用场景对比

先递归左子节点的:按照三种遍历方式遍历二叉树;
先递归右子节点的:需要先知道右子树/右子节点的情况的(如leetcode 538题

示例

定义如下二叉树:

4
1
6
0
2
null
3

则两种代码框架在三个位置的输出对比如下:
位置一:
在这里插入图片描述

位置二:
在这里插入图片描述
位置三:
在这里插入图片描述
测试完整代码参考仓库:https://gitee.com/raoqingmei2021/leetcodeComeon/blob/master/src/com/tree_/AcknowledgeBinaryTree.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值