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

一 LC101.对称二叉树

题目要求:

给你一个二叉树的根节点 root , 检查它是否轴对称。

101. 对称二叉树 - 力扣(LeetCode)

思路分析:

       如果树为空(root == null),那么它是对称的,返回 true。如果树不为空,检查它的左子树和右子树是否镜像对称。对于两棵树 leftright:它们的根节点值相等,且left 的左子树和 right 的右子树是对称的,且left 的右子树和 right 的左子树是对称的。

        我们可以使用递归或者迭代两种方法实现判断一棵树是否是对称的。这里我们使用递归法实现。

完整代码示例:

class Solution {
    public boolean isSymmetric(TreeNode root) {
         if (root == null) {
            return true; // 空树是对称的
        }
        return isMirror(root.left, root.right); // 检查左右子树是否镜像
    }
    private boolean isMirror(TreeNode left, TreeNode right) {
        // 如果两个子树都为空,则它们是镜像对称的
        if (left == null && right == null) {
            return true;
        }
        // 如果其中一个为空,则它们不是镜像对称的
        if (left == null || right == null) {
            return false;
        }
        // 两个子树的根节点值相等,并且左子树的左子树与右子树的右子树对称,左子树的右子树与右子树的左子树对称
        return (left.val == right.val)
            && isMirror(left.left, right.right)
            && isMirror(left.right, right.left);
    }
}

二 LC543.二叉树的直径

题目要求:

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

543. 二叉树的直径 - 力扣(LeetCode)

思路分析:

        要找到二叉树的直径,也就是计算树中任意两个节点之间的最长路径,路径可以经过也可以不经过根节点。我们可以递归遍历树的每个节点,并计算以每个节点为根节点的最长路径。具体而言,就是递归计算每个节点的的左子树和右子树的高度,该节点的直径就是左子树高度加上右子树高度,使用一个变量记录最大的高度作为返回值。

完整代码示例:

class Solution {
    private int maxDiameter = 0;  // 用于记录最大直径
    public int diameterOfBinaryTree(TreeNode root) {
           // 计算每个节点的高度,并更新最大直径
        depth(root);
        return maxDiameter;
    }
    // 递归函数,计算节点的高度,同时更新最大直径
    private int depth(TreeNode node) {
        if (node == null) {
            return 0; // 空节点的高度为0
        }

        // 递归计算左子树和右子树的高度
        int leftDepth = depth(node.left);
        int rightDepth = depth(node.right);

        // 更新直径,直径是左子树高度 + 右子树高度
        maxDiameter = Math.max(maxDiameter, leftDepth + rightDepth);

        // 返回当前节点的高度,等于左右子树最大高度 + 1
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

三 LC102.二叉树的层序遍历

题目要求:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

102. 二叉树的层序遍历 - 力扣(LeetCode)

思路分析:

       要实现二叉树的层序遍历,可以使用广度优先搜索(BFS),也就是通过一个队列来逐层遍历树的每个节点,按层记录每一层的节点值。如果树为空,直接返回空列表,否则使用队列存储每一层的节点,先将根节点加入队列,循环处理队列中的节点,从队列中取出当前层的所有节点,并将它们的子节点加入队列记录,当前层的节点值,并将其添加到结果列表中。当队列为空时,遍历结束。

完整代码示例:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();
        if (root == null) {
            return result; // 如果根节点为空,返回空列表
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root); // 将根节点加入队列

        while (!queue.isEmpty()) {
            List<Integer> currentLevel = new ArrayList<>(); // 当前层的节点值
            int size = queue.size(); // 当前层的节点数

            for (int i = 0; i < size; i++) {
                TreeNode currentNode = queue.poll(); // 取出队列中的节点
                currentLevel.add(currentNode.val); // 将当前节点的值加入当前层

                // 将子节点加入队列
                if (currentNode.left != null) {
                    queue.add(currentNode.left);
                }
                if (currentNode.right != null) {
                    queue.add(currentNode.right);
                }
            }
            result.add(currentLevel); // 将当前层加入结果集
        }

        return result;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值