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

算法训练营第十三天|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) 
http://www.xdnf.cn/news/5278.html

相关文章:

  • 多模态大模型中的视觉分词器(Tokenizer)前沿研究介绍
  • 【入门】数字走向II
  • JavaScript 数组去重:11 种方法对比与实战指南
  • 什么是 B2B?2B 产品销售怎么找客户?
  • Unity基础学习(十)Camera组件
  • [ctfshow web入门] web67
  • JVM对象创建内存分配
  • [特殊字符]️ 快速检测与修复TLS 1.0/1.1漏洞指南
  • 人形机器人:主控芯片
  • 红黑树算法笔记(二)性能对比实验
  • 解密数据结构之位图和布隆过滤器
  • TCP IP
  • 社区商城分销团长扩充与扩散策略优化的系统方案
  • Information Fusion期刊期刊投稿经验分享
  • 23、DeepSeekMath论文笔记(GRPO)
  • 计算机网络与多线程同步机制详解
  • Linux系统之----模拟实现shell
  • 轻量级因果语言视觉模型简述:nanoVLM-222M
  • 每日一题:两个仓库的最低配送费用问题
  • DNS负载均衡和CDN的区别
  • Redis 主从同步与对象模型(四)
  • 出现 SEGMENT: ?C_INITSEG 的原因:
  • ERP学习(一): 用友u8安装
  • 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘
  • smbd:快速拉取服務端SMB共享文件脚本工具
  • 从0开始学linux韦东山教程第三章问题小结(2)
  • 长短期记忆网络(LSTM)深度解析:理论、技术与应用全景
  • 每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
  • MySQL索引详解(上)(结构/分类/语法篇)
  • Excel里面怎样批量去掉字串包含的标点符号