当前位置: 首页 > news >正文

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度

递归

递归三部曲:

  • 1.确定参数和返回值
  • 2.确定终止条件
  • 3.确定单层逻辑

226.翻转二叉树

题目

在这里插入图片描述

思路与解法

第一想法: 递归,对每个结点进行反转

# 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 invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:cur = rootif cur:tmp = cur.leftcur.left = cur.rightcur.right = tmpself.invertTree(cur.left)self.invertTree(cur.right)return root

101. 对称二叉树

题目

在这里插入图片描述

思路与解法

carl的讲解:

# 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:if not root:return Truedef compare(left, right) -> bool:if not ((left and right) or (not left and not right)):return Falseif not left and not right:return Trueelif left.val != right.val:return Falseif not compare(left.left, right.right):return Falseif not compare(left.right, right.left):return Falsereturn Truereturn compare(root.left, root.right)

104.二叉树的最大深度

题目

在这里插入图片描述

思路与解法

第一思路: 可以用层序遍历,记录层数。递归的话就得想想了。不好描述,先写吧。
写了出来,在37/39个示例报超时。
在这里插入图片描述
发现超时的原因了,因为 16、17、18行的代码将get_depth(depth, node.left)get_depth(depth, node.right)各计算了两次。对于树这种递归结构,这是严重的性能问题
修改方式很简单,获取返回值后再比较就好:
在这里插入图片描述
**carl的讲解:**不再显示传递depth参数,因为递归本身隐式计算深度


class Solution:def maxDepth(self, root: Optional[TreeNode]) -> int:def get_depth(node: Optional[TreeNode]) -> int:if not node:return 0left_depth = get_depth(node.left)right_depth = get_depth(node.right)return 1 + max(left_depth, right_depth)return get_depth(root)

111.二叉树的最小深度

题目

在这里插入图片描述

思路与解法

第一想法: 就是简单的改前面的最大深度为最小深度。但是踩坑了,不是这么简单。
**carl的讲解:**因为最小深度的判别要比最大深度复杂。直接将max改成min是不行的,因为会把非叶子节点的值当作最小值返回。因为这个非叶子节点可能离根节点不愿,左边没节点但是右边有节点,这样他就可能得出的depth很小,但是他都不是叶子节点。

# 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 minDepth(self, root: Optional[TreeNode]) -> int:return self.get_depth(root)def get_depth(self, node: Optional[TreeNode]) -> int:if not node:return 0left_depth = self.get_depth(node.left)right_depth = self.get_depth(node.right)if node.left is None and node.right is not None:return right_depth + 1if node.right is None and node.left is not None:return left_depth + 1return 1 + min(left_depth, right_depth) 

相关文章:

  • 使用 librosa 测量《忘尘谷》节拍速度
  • 人形机器人量产元年开启,AI与物理世界深度融合
  • 局域网常用的测速工具,Iperf3使用教程
  • 数仓-如何保障指标的一致性
  • U盘制作系统盘(含U盘恢复)
  • dockerfile编写入门
  • 正式部署abp vnext应用程序时,如何生成openiddict.pfx证书文件
  • Proser:在使用中改进
  • 21、DeepSeekMath论文笔记(GRPO)
  • 如何更改typora图片存储位置
  • 从前端视角看网络协议的演进
  • 【入门】数字走向II
  • (二)Linux下基本指令 2
  • 动态规划法:爬楼梯
  • 深入浅出 JDBC 与数据库连接池
  • ai agent(智能体)开发 python3基础14:在python 中 总能看到方法里面套方法,那什么时候用这种方式合适呢?
  • 【编译原理】总结
  • Java面向对象
  • Dify+Ollama+Deepseek+BGE-M3来搭建本地知识库实操
  • 单片机系统设计不同开发方式的优缺点(面包板,洞洞板,PCB板)
  • 郎朗也来了,在辰山植物园“轻松听古典”
  • 视频丨雄姿英发!中国仪仗队步入莫斯科红场
  • 心相印回应官方旗舰店客服辱骂消费者:正排查
  • 江苏省人社厅党组书记、厅长王斌接受审查调查
  • 【社论】以法治力量促进民企长远健康发展
  • 马新民卸任外交部条约法律司司长