首页 > 编程语言 >代码随想录算法训练营第十四天 | 226.翻转二叉树、 101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

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

时间:2024-12-01 17:57:42浏览次数:11  
标签:node None right self 第十四天 二叉树 深度 root left

文档讲解:代码随想录

视频讲解:代码随想录

状态:完成4道题

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]:
        if not root:
            return None
        root.left, root.right = root.right, root.left # 中
        self.invertTree(root.left) # 左
        self.invertTree(root.right) # 右
        return root

后序遍历

# 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]:
        if not root:
            return None
        self.invertTree(root.left) # 左
        self.invertTree(root.right) # 右
        root.left, root.right = root.right, root.left # 中
        return root
        

中序遍历

思考:中序遍历不是左中右吗,为什么这里是左中左?

因为中间左右节点进行了交换,所以原来的右节点是现在的左节点

# 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]:
        if not root:
            return None
        self.invertTree(root.left) # 左
        root.left, root.right = root.right, root.left # 中
        self.invertTree(root.left) # 左
        return root
        

101. 对称二叉树

 递归:后序排序

# 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 True
        return  self.compare(root.left,root.right)

    def compare(self,left,right):
        # 对节点的数据进行过滤
        if left == None and right != None:
            return False
        elif left != None and right == None:
            return False
        elif left ==None and right ==None:
            return True
        elif left.val != right.val:
            return False
        
        outside = self.compare(left.left,right.right)
        inside = self.compare(left.right,right.left)
        isSame = outside and inside
        return isSame

104. 二叉树的最大深度

深度:二叉树中任意节点到根节点的距离(取决于深度从0开始还是从1开始),求深度是从上往下计数

高度:二叉树中任意节点到叶子节点的距离(取决于高度从0开始还是从1开始),求高度是从上往下计数

根节点的高度就是二叉树的最大深度,所以这里我们使用后序遍历树的高度

递归三部曲:

1、确定递归函数的参数和返回值

def getDepth(node)

2、确定终止条件

如果为空节点的话,就返回0,表示高度为0。

if not node:
    return 0

3、确定单层递归的逻辑

先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。

leftheight = self.getDepth(node.left) # 左
rightheight = self.getDepth(node.right) # 右
height = 1 + max(leftheight,rightheight) # 中
return height
# 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 maxDepth(self, root: Optional[TreeNode]) -> int:
        return self.getDepth(root)

    def getDepth(self,node):
        if not node:
            return 0
        
        leftheight = self.getDepth(node.left)
        rightheight = self.getDepth(node.right)
        height = 1 + max(leftheight,rightheight)
        return height

111. 二叉树的最小深度

这里要注意题目要求:

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

 根据题意可知,此题和求最大深度的题还是有很大区别的,这里的单层递归逻辑要考虑,左孩子为空和右孩子为空的情况,不要写成下面这样(按照下面代码的运行逻辑,返回的最小深度是1,是错误的)

leftheight = self.getDepth(node.left) # 左
rightheight = self.getDepth(node.right) # 右
height = 1 + max(leftheight,rightheight) # 中
return height

正确写法,考虑左孩子为空和右孩子为空的情况

leftheight = self.getDepth(node.left)
rightheight = self.getDepth(node.right)
if node.left == None and node.right != None:
    return 1 + rightheight
if node.left != None and node.right == None:
    return 1 + leftheight
height = 1 + min(leftheight,rightheight)
return height
# 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.getDepth(root)
    def getDepth(self,node):
        if not node:
            return 0
        
        leftheight = self.getDepth(node.left)
        rightheight = self.getDepth(node.right)
        if node.left == None and node.right != None:
            return 1 + rightheight
        if node.left ! = None and node.right == None:
            return 1 + leftheight
        height = 1 + min(leftheight,rightheight)
        return height

标签:node,None,right,self,第十四天,二叉树,深度,root,left
From: https://blog.csdn.net/weixin_40702604/article/details/144146808

相关文章

  • 数据结构第一弹-二叉树
    大家好,今天和大家一起分享一下数据结构中的二叉树~二叉树是一种非常基础且重要的非线性数据结构,广泛应用于各种算法和系统设计中。今天详细介绍二叉树的基本概念、性质以及操作方法,并特别展开讨论一种特殊的二叉树——二叉搜索树(BinarySearchTree,BST)一、二叉树概述二......
  • 102. 二叉树的层序遍历
    问题描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。分析对于nullptr:先判不空再入队入队列后在for中判空,为空则continue第一种更好,因为如果为空,即使continue也会影响全局,比如该题中res.push_back(layer_res);当某层结点为空,则lay......
  • 二叉树的遍历方式详解及代码示例
    二叉树的遍历方式详解及代码示例二叉树的遍历方式详解及代码示例摘要引言1.二叉树的前序遍历(Pre-orderTraversal)1.1前序遍历的定义1.2前序遍历的代码示例输出:2.二叉树的中序遍历(In-orderTraversal)2.1中序遍历的定义2.2中序遍历的代码示例输出:3.二叉树的后......
  • 动手学深度学习-2数据预处理、3线性代数
    目录数据预处理 读取数据集处理缺失值 转换为张量格式 小结线性代数标量向量长度、维度和形状 矩阵张量张量算法的基本性质 降维非降维求和 点积(DotProduct)矩阵-向量积 矩阵-矩阵乘法范数范数和目标 小结数据预处理为了能用深度学习来解决现......
  • AI大模型系列之二:ChatGPT科普(深度好文)
     目录引言语言模型的发展历程ChatGPT是什么?预训练ChatGPT分几步?第一步:如何炼成ChatGPT?第二步:如何微调ChatGPT?第三步:如何强化ChatGPT?GPT背后的黑科技Transformer是什么?Transformer在计算机视觉上CV最佳作品?ChatGPT模型的基本原理引言开篇之前,先用战略......
  • 深度学习笔记——BLIP2
    本文详细介绍多模态模型:BLIP2。推荐阅读:BLIP2-图像文本预训练论文解读【多模态】BLIP-2模型技术学习文章目录回顾BLIPBLIP的问题及BLIP2的优化1.模块化架构设计2.引入Q-Former模块3.分阶段训练策略4.减少计算开销BLIP2架构表征学习阶段RepresentationL......
  • 【每天一篇深度学习论文】基于CNN和Transformer的局部和全局特征提取模块
    目录论文介绍题目:论文地址:创新点方法整体结构实验结果即插即用模块代码论文介绍题目:LEFormer:AHybridCNN-TransformerArchitectureforAccurateLakeExtractionfromRemoteSensingImagery论文地址:https://arxiv.org/pdf/2308.04397创新点这篇文章介......
  • 链式二叉树
    引言在探讨数据结构时,我们不难发现,虽然普通的链式二叉树在存储数据上可能不如前面用数组模拟二叉树直观,但其独特的结构为后续的复杂数据结构奠定了基础。特别是当我们谈及搜索问题时,搜索二叉树以其高效的搜索性能脱颖而出,与二分查找法有着异曲同工之妙。但是,二分查找法在实际......
  • AI大模型系列之一:大模型原理科普(深度好文)
    AI大模型系列之一:大模型原理科普(深度好文)目录认识AI大模型家族AI是什么?机器学习是什么?机器学习有哪些分支?什么是强化学习?深度学习属于哪一类学习?生成式AI和深度学习是什么关系?大语言模型是什么?所有大语言模型都是生成式AI?大语言模型LLM(largelanguagemo......
  • 深度剖析 | 低功耗模组Air724UG的软件实例:KEYPAD教程!
    本次我要要深度剖析的是低功耗4G模组Air724UG的软件实例,关于KEYPAD的教程,赶紧来学吧。一、简介在电路设计中,通常需要较多的外部输入,如果每个按键都单独去占用一个IO接口,就会非常浪费资源,为了减少I/O口的占用,通常将按键排列成矩阵形式,即矩阵键盘。特性:KEYIN0扫描键盘输入......