代码随想录算法训练营第14天|226. 翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111. 二叉树的最小深度

news2024/9/21 2:48:42

目录

  • 226. 翻转二叉树
    • 1、题目描述
    • 2、思路
    • 3、code(后序递归)
  • 101. 对称二叉树
    • 1、题目描述
    • 2、思路
    • 3、code
  • 104. 二叉树的最大深度
    • 1、题目描述
    • 2、思路
    • 3、code
  • 111. 二叉树的最小深度
    • 1、题目描述
    • 2、思路
    • 3、code

226. 翻转二叉树

题目链接:link

1、题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 1:
在这里插入图片描述输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

2、思路

😺翻转就是交换左右孩子,那就可以在遍历的过程中进行交换
🌟前序(中左右)和后序都是可以的
❌中序不可以,why?因为中序遍历会把某些节点的左右孩子翻转了两次!

3、code(后序递归)

class Solution:
    def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None:
            return root
        # 思路:后续遍历,在中的时候翻转
        def dfs(node):
            if node is None:
                return 
            dfs(node.left)
            dfs(node.right)
            node.left, node.right = node.right, node.left
            return node
        new_root = dfs(root)
        return new_root

101. 对称二叉树

题目链接:link

1、题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
在这里插入图片描述
输入:root = [1,2,2,3,4,4,3]
输出:true

2、思路

❌最开始的错误思路:后续遍历,把得到的数组出去最后一个看看是否是对称的,但是这样的话会判断出错这样的情况:在这里插入图片描述
✅判断节点的左右子树是否能相互翻转
在这里插入图片描述
在这里插入图片描述

3、code

class Solution:
    # 判断对称二叉树:判断根节点的左右树是否是可以翻转的->也就是判断两颗数的外侧和内侧的节点值是否是相等的
    # 左树的外侧是左孩子,右数的外侧是右孩子
    # 左树的内侧是右孩子,右树的内侧是左孩子
    def compare(self, left, right):
        # 首先要判断左右孩子是否是空节点的情况也就是终止条件
        if left is None and right is not None: # 左孩子是空的,右孩子不是空的
            return False
        elif left is not None and right is None: # 左孩子不是空的,右孩子是空的
            return False
        elif left is None and right is None: # 如果左右孩子都为空,说明是对称的
            return True
        elif left.val != right.val: # 此时左右孩子都不为空,且值不相等
            return False
        else: # 还剩一个情况:左右孩子不为空,且值相等
            # 下一步比较这个节点的左右孩子的外侧和内侧节点
            flag1 = self.compare(left.left, right.right)
            flag2 = self.compare(left.right, right.left)
            result = flag1 and flag2
            return result
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        return self.compare(root.left, root.right)

104. 二叉树的最大深度

题目链接:link

1、题目描述

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

💜深度:节点到根节点的节点数
💚高度:节点到叶子节点的节点数

2、思路

🟪🟪🟪树的最大深度就是根节点的最大高度🟪🟪🟪
此时,题目就变成了求根节点的最大高度,那就是 m a x ( 左子树的高度,右子树的高度 ) + 1 max(左子树的高度,右子树的高度)+1 max(左子树的高度,右子树的高度)+1
这样的话就需要先知道左右子树的高度➡️ 后序遍历(左右中)

3、code

class Solution:
    # 计算节点的高度,要统计左右两个子树的高度,后序,左右中
    def dfs(self,node):
        if node is None:
            return 0
        left_height = self.dfs(node.left)
        right_height = self.dfs(node.right)
        height = max(left_height,right_height)+1
        return height

    def maxDepth(self, root: Optional[TreeNode]) -> int:
        # 根节点的高度就是最大深度
        return self.dfs(root)

111. 二叉树的最小深度

题目链接:link

1、题目描述

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。

2、思路

求最大高度:树的最大深度就是根节点的最大高度
此时,题目就变成了求根节点的最大高度,那就是 m a x ( 左子树的高度,右子树的高度 ) + 1 max(左子树的高度,右子树的高度)+1 max(左子树的高度,右子树的高度)+1

那求最小高度就应该是: m i n ( 左子树的高度,右子树的高度 ) + 1 min(左子树的高度,右子树的高度)+1 min(左子树的高度,右子树的高度)+1
😡要单独考虑左子树或者右子树高度为0的情况
在这里插入图片描述

3、code

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        # 根节点的最小高度就是最小深度
        return self.dfs(root) 
    # 计算节点的高度,要统计左右两个子树的高度,后序,左右中
    def dfs(self,node):
        if node is None:
            return 0
        left_height = self.dfs(node.left)
        right_height = self.dfs(node.right)
        if left_height ==0  and right_height!=0:
            height = right_height + 1
        elif left_height != 0 and right_height == 0:
            height = left_height + 1
        else:
            height = min(left_height,right_height)+1
        return height

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年最新软件测试学习路线图(从入门到精通)

六维全息课程注重综合能力培养,从入学到职后一站式服务测试开发人才。2024年最新软件测试学习路线图,从入门到精通一应俱全。 9阶段专业课11大专项测试项目 适应互联网企业测试开发需求。 对于想入行学软件测试的新手来说,首先就需要一个高效…

GESP等级考试 C++二级-if语句

if语句是C中的选择语句,通过if语句程序可以在一种可能、二种可能或者多种可能中做出选择,对于不同的可能进行不同的处理。 1 一种可能 使用if语句对一种可能进行处理的格式如下所示: if (表达式) {语句; } 其中,if后面跟一个圆…

预报名来啦!25届考研所有重要时间节点和注意事项一览

预报名即将开始,学姐给大家准备了,详细的报考流程及常见问题,每年都有学生因为报名出问题导致没法参加考试,大家一定要认真对待哦~ 一.报名时间及流程 01 预报名时间 2024年9月24日至9月27日,9:00—22:00 02 预报名…

高校课堂教学管理系统小程序的设计

管理员账户功能包括:系统首页,个人中心,学生管理,教师管理,课程分类管理,课程资源管理,互动论坛,系统管理 微信端账号功能包括:系统首页,课程资源&#xff0…

HarmonyOS ArkUI 构建布局

文章目录 一、构建布局1.线性布局 (Row/Column)1.1 Blank空白填充组件1.2 layoutWeight 自适应缩放1.3 自适应延伸 2.弹性布局 (Flex)3.栅格布局 (GridRow/GridCol)3.创建列表 (List) 一、构建布局 1.线性布局 (Row/Column) 线性布局文档 通过线性容器Row和Column构建 Column…

QT之QML学习五:添加自定义Qml组件,以及组件管理

开发环境: 1、Qt 6.7.2 2、Pyside6 3、Python 3.11.4 4、Windows 10 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!! 重要的事情说三遍,使用自定义qml参考链接: Qt官网参考网址!!!…

怎么看待伦敦银交易的风险与收益?

伦敦银交易的风险与收益,在宣传材料中,伦敦银是一种潜在收益很高,潜在风险不大的品种。然而在实践中我们发现,伦敦银交易好像并不如宣传材料说的那样容易做。那么,具体伦敦银交易的风险和收益是怎么样的?那…

Python:只需20行代码,一键下载网络热门短剧,简直不要太爽!

网络短剧铺天盖地,主打的就是一个爽字,但有有些博主就是不当人,喜欢一剪没,正当我们看的津津有味的时候,进度条却到底了!!! 对于大家来说,想看续集,都是全凭实…

力扣第560题 和为k的子数组

前言 记录一下刷题历程 力扣第560题 和为k的子数组 和为k的子数组 原题目:给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums …

源码分析:LinkedList

一、LinkedList 简介 LinkedList 是一个基于双向链表实现的集合类,经常被拿来和 ArrayList 做比较。 不过,我们在项目中一般是不会使用到 LinkedList 的,需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替,并且&#x…

7-8 哈利·波特的考试

题意简述: 给一个图,求一个点,该点离其他点最小距离的最大值 最小。 输入样例: 6 11 3 4 70 1 2 1 5 4 50 2 6 50 5 6 60 1 3 70 4 6 60 3 6 80 5 1 100 2 4 60 5 2 80输出样例: 4 70 注意:0x3f不能写在判断里面,…

【大模型训练】Flash Attention详解

文章目录 前言预备知识FlashAttention1传统Attention计算方式FlashAttention1的基本原理除去Softmax操作的分块计算Softmax分块计算Attention分块计算 FlashAttention2参考资料 前言 FlashAttention系列工作,是一种加速注意力计算方法,目前已经应用在&a…

解决TensorFlow-GPU安装错误:Python版本兼容性与环境配置问题

创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力! 从错误信息中可以看到,tensorflow-gpu 安装时出现了 packaging.requirements.InvalidRequirement 错误,具体是因为解析 Python 版本时出现了问题。这通常是由于环…

OpenAI全新发布o1模型:开启 AGI 的新时代

OpenAI全新发布o1模型:开启 AGI 的新时代 欢迎关注【youcans的AGI学习笔记】原创作品 2024年9月13日,OpenAI新模型o1 正式发布。o1 在测试化学、物理和生物学专业知识的基准 GPQA-diamond 上,全面超过了人类博士专家。 OpenAI 宣称&#xff…

CANFD芯片应用中关键功能和性能指标分析

CAN FD芯片通信速率高达5Mbps,需要线缆少传输距离较远,在汽车、工业、宇航、能源等领域应用越来越广。 1)汽车工业:汽车内部电子系统日益复杂,需要高速、可靠的数据传输来确保车辆的安全和性能。CAN FD通信提供了更高…

R数据对象快速保存与读取:qs包

qs:R对象的快速序列化 qs是一个R语言包,使用qs可以快速地从磁盘中保存和读取对象。** 它的主要目的是替换R中的saveRDS和readRDS函数,提供了一个更加快速而完整的数据读写方法。 ** 受到fst的启发,qs通过lz4/zstd库使用了类似的块…

人工智能和机器学习:探讨人工智能和机器学习的最新发展、应用、挑战和未来趋势

人工智能和机器学习是当前科技领域的热点话题,其最新发展、应用、挑战和未来趋势备受关注。 最新发展: 人工智能和机器学习技术在近年来得到了快速发展,尤其是深度学习技术的广泛应用。例如,深度学习在图像识别、语音识别、自然语…

docker入门安装及使用

docker概述 docker是一种容器技术,它提供了标准的应用镜像(包含应用和应用多需要的依赖),因此,我们可以非常轻松的在docker中安装应用,安装好的应用相当于一个独立的容器 如下图所示,为docker中…

机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局

今天我们一起学习一篇最近发表在Journal for immunotherapy of cancer (IF 10.9)上的文章,Machine learning for prediction of immunotherapeutic outcome in non-small-cell lung cancer based on circulating cytokine signatures[基于循环…

制证书、制电子印章、签章 -- 演示程序说明

ofd签章系统涉及证书的制作、电子印章制作、签章、验章等环节。关于ofd签章原理,本人写过多篇文章进行了阐述; 见文章《ofd板式文件 电子签章实现方法》、《一款简单易用的印章设计工具》、《签章那些事 -- 让你全面了解签章的流程》。 为了进一步加深对签章过程的理…