力扣刷题(第二十四天)

灵感来源 

- 保持更新,努力学习

- python脚本学习

二叉树的最小深度

解题思路

这道题要求找出二叉树的最小深度,也就是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。解题的关键在于理解最小深度的定义,并处理好各种边界情况。

方法:广度优先搜索(BFS)

  • 思路:使用广度优先搜索(BFS)遍历树,BFS 按照层级遍历节点,一旦遇到叶子节点(即没有左右子节点的节点),当前层级就是最小深度,直接返回即可。这种方法效率高,因为不需要遍历所有节点。
  • 步骤
    1. 如果根节点为空,直接返回 0。
    2. 初始化队列,将根节点加入队列,同时记录深度为 1。
    3. 循环遍历队列中的每个节点:
      • 检查当前节点是否为叶子节点,如果是则返回当前深度。
      • 否则,将其左右子节点(如果存在)加入队列,并将深度加 1。
        # 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
        from collections import deque
        
        class Solution:
            def minDepth(self, root: Optional[TreeNode]) -> int:
                if not root:
                    return 0
                
                queue = deque([(root, 1)])
                
                while queue:
                    node, depth = queue.popleft()
                    
                    # 检查是否是叶子节点
                    if not node.left and not node.right:
                        return depth
                    
                    # 否则将子节点加入队列
                    if node.left:
                        queue.append((node.left, depth + 1))
                    if node.right:
                        queue.append((node.right, depth + 1))
                
                return 0  # 实际上不会执行到这一步,因为树至少有一个节点

逐行解释

# 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
from collections import deque

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        # 如果根节点为空,直接返回深度0
        if not root:
            return 0
        
        # 初始化队列,使用双端队列实现BFS,队列元素为(节点, 当前深度)
        queue = deque([(root, 1)])
        
        # 开始BFS遍历
        while queue:
            # 从队列左侧取出节点和对应的深度
            node, depth = queue.popleft()
            
            # 检查当前节点是否是叶子节点(没有左右子节点)
            # 如果是叶子节点,直接返回当前深度,即为最小深度
            if not node.left and not node.right:
                return depth
            
            # 如果当前节点不是叶子节点,将其非空子节点加入队列
            # 左子节点存在则加入队列,深度+1
            if node.left:
                queue.append((node.left, depth + 1))
            # 右子节点存在则加入队列,深度+1
            if node.right:
                queue.append((node.right, depth + 1))
        
        # 实际上不会执行到这一步,因为树至少有一个节点
        # 为了代码完整性保留此返回语句
        return 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值