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

Day 14 卡玛笔记

这是基于代码随想录的每日打卡

226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

img

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

img

输入:root = [2,1,3]
输出:[2,3,1]

示例 3:

输入: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]:
        # 如果根节点为None直接返回
        if root==None:
            return root
        # 递归函数
        def invert(node):
            # 空节点直接返回上一层
            if node==None:
                return
            # 交换节点
            node.left,node.right=node.right,node.left
            invert(node.left)
            invert(node.right)
        invert(root)
        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 root==None:
#             return root
#         def invert(node):
#             if node==None:
#                 return            
#             invert(node.left)
#             invert(node.right)
#             node.left,node.right=node.right,node.left
#         invert(root)
#         return root

运行结果

在这里插入图片描述



递归法(伪中序)

为什么叫伪中序呢?因为真正的中序是翻转不了二叉树的。中序的遍历顺序的左中右,以下面二叉树为例:

在这里插入图片描述

若是中序遍历,第一次翻转时将翻转9和6

在这里插入图片描述

第二次遍历将翻转4的左右孩子

在这里插入图片描述

下一步就需要翻转4的右孩子,7了,可是第一步我们才刚刚翻转过,所以采用中序遍历会导致乱序,但是我们可以换一步想:将左中右换成左中左的遍历顺序不就可以了吗

代码

# 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 root==None:
            return root
        def invert(node):
            if node==None:
                return
            invert(node.left)
            node.left,node.right=node.right,node.left
            invert(node.left)
        invert(root)
        return root

运行结果

在这里插入图片描述



101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

img

输入:root = [1,2,2,null,3,null,3]
输出:false

递归法

代码

# 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 root==None:
            return True
        def compare(left,right):
            # 递归终止条件
            if left==None and right:
                return False
            if left and right==None:
                return False
            if left==None and right==None:
                return True
            if left.val != right.val:
            	return False
        	# 递归逻辑
            bool1=compare(left.left,right.right)
            bool2=compare(left.right,right.left)
            return bool1 and bool2
        # 传入根节点的左后孩子
        return compare(root.left,root.right)

运行结果

在这里插入图片描述


104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:3

示例 2:

输入:root = [1,null,2]
输出:2

递归法

# 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:
        # 这里用的是后序遍历
        def getdepth(node):
            if node==None:
                return 0
            leftheight=getdepth(node.left)
            rightheight=getdepth(node.right)
            # 为什么是1加最大值?
            # 当节点为叶子节点时,叶子节点的左右孩子返回1+0=1,也就是说叶子节点的高度为1
            height=1+max(leftheight,rightheight)
            # 返回高度给上一层
            return height
        return getdepth(root)

运行结果

在这里插入图片描述



559. N 叉树的最大深度

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

示例 1:

img

输入:root = [1,null,3,2,4,null,5,6]
输出:3

示例 2:

img

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:5

代码

"""
# Definition for a Node.
class Node:
    def __init__(self, val: Optional[int] = None, children: Optional[List['Node']] = None):
        self.val = val
        self.children = children
"""

class Solution:
    def maxDepth(self, root: 'Node') -> int:
        def maxdepth(node):
            if node==None:
                return 0
            max_depth=1
            for child in node.children:
                max_depth=max(max_depth,maxdepth(child)+1)
            return max_depth
        return maxdepth(root)

运行结果

在这里插入图片描述



111. 二叉树的最小深度

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

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

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

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:2

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

递归法

求最小深度和求最大深度一样后序遍历就可以了,有些人可能会直接这样的代码:

leftheight=getmin(node.left)
rightheight=getmin(node.right)
height=min(leftheight,rightheight)+1

其实还有这个误区:

代码

# 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:
        def getmin(node):
            if node==None:
                return 0
            # 当右节点为空,左节点不为空
            if node.left==None and node.right!=None:
                return 1+getmin(node.right)
            # 当左节点不为空,右节点为空
            if node.left!=None and node.right==None:
                return 1+getmin(node.left)
            leftheight=getmin(node.left)
            rightheight=getmin(node.right)
            height=min(leftheight,rightheight)+1
            return height
        return getmin(root)

运行结果

在这里插入图片描述

有问题欢迎评论或私信


http://www.kler.cn/a/513950.html

相关文章:

  • 雷电9最新版安装Magisk+LSPosd(新手速通)
  • Golang Gin系列-4:Gin Framework入门教程
  • 安装 uv
  • 【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评
  • 【生产力工具】ChatGPT for Windows桌面版本安装教程
  • Mysql数据库锁
  • Java设计模式 十一 外观模式 (Facade Pattern)
  • django使用踩坑经历
  • springboot基于前后端分离的摄影知识网站
  • 新书速览|算法竞赛入门笔记
  • 吴恩达深度学习——建立逻辑回归分类器识别猫
  • html简单项目案例
  • 私有IP、VLAN和VPC,分别适合哪些场景你知道吗?
  • R语言的图形用户界面
  • Android 13 灭屏音乐播放问题解决与优化建议
  • 【MySQL】超详细MySQL常用日期格式转换函数、字符串函数、聚合函数(最新版)
  • 读取配置文件方式
  • Docker网段和服务器ip冲突导致无法访问网络的解决方法
  • 如何使用python技术爬取下载百度文库文档?
  • “深入浅出”系列之算法篇:(2)openCV、openMV、openGL
  • 【vim】vim怎样直接跳转到某行?
  • dl学习笔记:(7)完整神经网络流程
  • TongESB7.1.0.0如何使用dockercompose运行镜像(by lqw)
  • 失业ing
  • 【22】Word:小李-高新技术企业政策❗
  • 机器学习09-Pytorch功能拆解