力扣刷题(第二十一天)

灵感来源 

- 保持更新,努力学习

- python脚本学习

二叉树的最大深度

解题思路

这道题要求计算二叉树的最大深度,即从根节点到最远叶子节点的最长路径上的节点数。可以使用递归或迭代方法解决:

  1. 递归法(推荐):

    • 每个节点的最大深度等于其左右子树深度的最大值加 1(当前节点自身)。
    • 递归终止条件:空节点的深度为 0。
      class TreeNode:
          def __init__(self, val=0, left=None, right=None):
              self.val = val
              self.left = left
              self.right = right
      
      def maxDepth(root: TreeNode) -> int:
          if not root:
              return 0
          left_depth = maxDepth(root.left)
          right_depth = maxDepth(root.right)
          return max(left_depth, right_depth) + 1
  2. 迭代法(层序遍历):

    • 使用队列进行层序遍历(BFS),每遍历一层深度加 1。
    • 每层处理完后,队列中恰好剩下下一层的所有节点。
      from collections import deque
      
      class TreeNode:
          def __init__(self, val=0, left=None, right=None):
              self.val = val
              self.left = left
              self.right = right
      
      def maxDepth(root: TreeNode) -> int:
          if not root:
              return 0
          queue = deque([root])
          depth = 0
          while queue:
              # 当前层的节点数
              level_size = len(queue)
              for _ in range(level_size):
                  node = queue.popleft()
                  if node.left:
                      queue.append(node.left)
                  if node.right:
                      queue.append(node.right)
              depth += 1
          return depth

逐行解释

递归法

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val       # 当前节点的值
        self.left = left     # 左子节点
        self.right = right   # 右子节点

def maxDepth(root: TreeNode) -> int:
    # 递归终止条件:如果当前节点为空,深度为0
    if not root:
        return 0
    
    # 递归计算左子树的最大深度
    left_depth = maxDepth(root.left)
    
    # 递归计算右子树的最大深度
    right_depth = maxDepth(root.right)
    
    # 当前节点的最大深度为左右子树深度的最大值加1(包含当前节点)
    return max(left_depth, right_depth) + 1

迭代法

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val       # 当前节点的值
        self.left = left     # 左子节点
        self.right = right   # 右子节点

def maxDepth(root: TreeNode) -> int:
    # 如果根节点为空,树的深度为0
    if not root:
        return 0
    
    # 使用双端队列存储待处理的节点,初始时队列包含根节点
    queue = deque([root])
    depth = 0  # 初始化树的深度为0
    
    # 循环处理队列中的所有节点,直到队列为空
    while queue:
        # 当前层的节点数量(即队列的当前长度)
        level_size = len(queue)
        
        # 处理当前层的所有节点
        for _ in range(level_size):
            # 从队列左侧取出一个节点进行处理
            node = queue.popleft()
            
            # 如果该节点有左子节点,将左子节点加入队列
            if node.left:
                queue.append(node.left)
            
            # 如果该节点有右子节点,将右子节点加入队列
            if node.right:
                queue.append(node.right)
        
        # 处理完一层后,树的深度加1
        depth += 1
    
    # 返回最终计算的树的最大深度
    return depth
好的,关于力扣C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣中,使用 string 可以方便地处理字符串相关的问。 9. 注意边界条件:在力扣中,边界条件往往是解决问的关键。需要仔细分析目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值