【思路详解+详细注释】小白都能看懂的力扣算法详解——二叉树

一 LC94.二叉树的中序遍历

题目要求:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

94. 二叉树的中序遍历 - 力扣(LeetCode)

思路分析:

       中序遍历的顺序是:左子树 -> 根节点 -> 右子树。通过递归的方式,我们可以按照以下步骤遍历二叉树:

        如果当前节点的左子树不为空,那么先递归遍历左子树。在遍历完左子树后,访问当前节点(根节点),最后递归访问当前节点的右子树。

完整代码示例:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();  // 用于存储遍历结果的列表
        inorderHelper(root, result);  // 调用辅助函数进行递归遍历
        return result;  // 返回遍历结果
    }
    // 中序遍历的递归辅助函数
    private void inorderHelper(TreeNode node, List<Integer> result) {
        // 递归终止条件:如果当前节点为空,直接返回
        if (node == null) {
            return;
        }

        // 递归遍历左子树
        inorderHelper(node.left, result);

        // 访问根节点:将当前节点的值加入到结果列表中
        result.add(node.val);

        // 递归遍历右子树
        inorderHelper(node.right, result);
    }
}

 

二 LC104.二叉树的最大深度

题目要求:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

104. 二叉树的最大深度 - 力扣(LeetCode)

思路分析:

       最大深度是指从根节点到最远叶子节点的最长路径上的节点数。这个问题可以通过递归的方法求解。对于每一个节点,最大深度等于其左子树的最大深度和右子树的最大深度中的较大者,再加 1(加上当前节点自身),如果当前节点为空,说明已经到达叶子节点的子节点,此时返回深度为 0。

        具体而言,对于每一个节点,我们需要递归计算它的左子树和右子树的深度,如果该节点为空(即递归到了叶子节点的子节点),我们返回 0,如果不为空,则通过递归调用左子树和右子树的最大深度,取较大值,并加 1(表示包含当前节点的深度)。

完整代码示例:

class Solution {
    public int maxDepth(TreeNode root) {
        // 递归终止条件:如果当前节点为空,返回深度为 0
        if (root == null) {
            return 0;
        }

        // 递归计算左子树的深度
        int leftDepth = maxDepth(root.left);

        // 递归计算右子树的深度
        int rightDepth = maxDepth(root.right);

        // 当前节点的深度为左右子树深度的较大值加 1
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

三 LC226.翻转二叉树

题目要求:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

226. 翻转二叉树 - 力扣(LeetCode)

思路分析:

       翻转二叉树的意思是将每个节点的左右子树进行交换,即将左子树变为右子树,右子树变为左子树。这个问题可以通过递归来实现,逐步对每一个节点的左右子树进行交换,当节点为 null 时,表示已经到达叶子节点的子节点,不再需要翻转,返回该节点,否则递归调用左右子树的反转,并将结果分别存储在 leftright 变量中,将递归翻转后的左子树赋值给当前节点的右子树,将翻转后的右子树赋值给当前节点的左子树,从而完成翻转,返回当前节点作为新的根节点,确保递归逐层返回时,整个二叉树都被翻转。。

完整代码示例:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        // 递归终止条件:如果当前节点为空,直接返回
        if (root == null) {
            return null;
        }

        // 递归翻转左子树和右子树
        TreeNode left = invertTree(root.left);
        TreeNode right = invertTree(root.right);

        // 交换当前节点的左子树和右子树
        root.left = right;
        root.right = left;

        // 返回当前节点,作为翻转后的根节点
        return root;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值