力扣热门算法题 102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树

58 篇文章 1 订阅
55 篇文章 0 订阅

102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.25 可通过leetcode所有测试用例

目录

102. 二叉树的层序遍历

解题思路

完整代码

Java

Python

104. 二叉树的最大深度

解题思路

完整代码

Java

Python

110. 平衡二叉树

解题思路

完整代码

Java

Python


102. 二叉树的层序遍历

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

解题思路

要解决这个问题,我们可以使用广度优先搜索(BFS)策略。这个策略适合层序遍历,因为它先访问离根节点近的节点,然后再访问离根节点远的节点。具体到二叉树的层序遍历,我们可以按照以下步骤进行:

  1. 初始化一个队列,将根节点入队。
  2. 当队列不为空时,进行循环:
    • 记录当前队列的大小,这个大小即为当前层的节点数。
    • 依次处理当前层的每个节点:将节点从队列中移除,并记录其值;然后按照从左到右的顺序,将其非空子节点入队。
    • 将当前层的节点值列表加入最终结果中。
  3. 当队列为空时,所有节点已访问完毕,返回最终结果。

完整代码

Java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
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.offer(root);
        
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            List<Integer> level = new ArrayList<>();
            
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);
                
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            
            result.add(level);
        }
        
        return result;
    }
}
Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        if not root:
            return []
        
        result, queue = [], [root]
        
        while queue:
            level_size = len(queue)
            level = []
            
            for _ in range(level_size):
                node = queue.pop(0)
                level.append(node.val)
                
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            
            result.append(level)
        
        return result

104. 二叉树的最大深度

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

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

解题思路

为了解决这个问题,我们可以采用递归的方法来计算二叉树的最大深度。具体的思路如下:

  1. 基础情况:如果当前节点为空,即到达了叶子节点的下一个位置,返回深度为0。
  2. 递归计算:对当前节点的左右子树分别递归调用函数计算其最大深度。
  3. 合并结果:当前节点的最大深度等于其左右子树最大深度的较大者加1(加的这个1代表当前节点这一层)。

完整代码

Java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
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;
    }
}
Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        # 基础情况:如果当前节点为空,则返回深度0
        if not root:
            return 0

        # 递归计算左子树的最大深度
        left_depth = self.maxDepth(root.left)
        # 递归计算右子树的最大深度
        right_depth = self.maxDepth(root.right)

        # 当前节点的最大深度为左右子树的最大深度的较大值加1
        return max(left_depth, right_depth) + 1

110. 平衡二叉树

给定一个二叉树,判断它是否是 

平衡二叉树

  

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

解题思路

判断一个二叉树是否是平衡二叉树,我们需要了解平衡二叉树的定义:一个二叉树如果每个节点的左右两个子树的高度差的绝对值不超过1,那么它就是平衡二叉树。基于这个定义,我们可以采用递归的方法来解决这个问题,具体思路如下:

  1. 递归函数的目的:编写一个辅助函数,该函数返回两个信息:当前子树是否平衡,以及当前子树的高度。

  2. 基础情况:如果当前节点为空,那么这个子树自然是平衡的,高度为0。

  3. 递归逻辑

    • 对当前节点的左子树调用递归函数,获取左子树是否平衡以及左子树的高度。
    • 对当前节点的右子树调用递归函数,获取右子树是否平衡以及右子树的高度。
    • 如果左右子树都是平衡的,并且左右子树的高度差的绝对值不超过1,则当前子树是平衡的。当前子树的高度是左右子树的高度的较大值加1。
  4. 终止条件:如果在任何时候发现子树不平衡,则可以立即停止进一步的递归,因为不需要再检查其他部分了。

完整代码

Java
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        return check(root).isBalanced;
    }
    
    private TreeInfo check(TreeNode node) {
        if (node == null) {
            return new TreeInfo(true, 0);
        }
        
        TreeInfo left = check(node.left);
        TreeInfo right = check(node.right);
        
        boolean isBalanced = left.isBalanced && right.isBalanced && Math.abs(left.height - right.height) <= 1;
        int height = 1 + Math.max(left.height, right.height);
        
        return new TreeInfo(isBalanced, height);
    }
    
    class TreeInfo {
        boolean isBalanced;
        int height;
        
        TreeInfo(boolean isBalanced, int height) {
            this.isBalanced = isBalanced;
            this.height = height;
        }
    }
}
Python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def check(node):
            if not node:
                return True, 0
            
            leftBalanced, leftHeight = check(node.left)
            rightBalanced, rightHeight = check(node.right)
            
            # 当前子树是否平衡,以及当前子树的高度
            return (leftBalanced and rightBalanced and abs(leftHeight - rightHeight) <= 1, 
                    1 + max(leftHeight, rightHeight))
        
        return check(root)[0]

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊昊该干饭了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值