力扣刷题第二十八天--二叉树

前言

今天的五道题都是层序遍历的模板,深度优先的递归还不太熟。继续努力。

内容

一、在每个树行中找最大值

515.在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

广度优先搜素

时间复杂度:O(n),其中 nnn 为二叉树节点个数,每一个节点仅会进出队列一次。

空间复杂度:O(n),存储二叉树节点的空间开销。

func largestValues(root *TreeNode) []int {var res []intif root==nil{return res}//没有这个会panic: runtime error: invalid memory address or nil pointer dereference  curLevel:=[]*TreeNode{root}for len(curLevel)>0{nextLevel:=[]*TreeNode{}maxVal:=math.MinInt32for _,node:=range curLevel{maxVal= Max(maxVal,node.Val)if node.Left!=nil{nextLevel=append(nextLevel,node.Left)}if node.Right!=nil{nextLevel=append(nextLevel,node.Right)}}res=append(res,maxVal)curLevel=nextLevel}return res
}func Max(a,b int)int{if a>b{return a}else{return b}
}
深度优先搜索

时间复杂度:O(n),其中 nnn 为二叉树节点个数。二叉树的遍历中每个节点会被访问一次且只会被访问一次。

空间复杂度:O(height)。其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

func largestValues(root *TreeNode)(ans []int){var dfs func(*TreeNode,int)dfs=func(node *TreeNode,height int){if node==nil{return}if height==len(ans){ans=append(ans,node.Val)}else{ans[height]=max(ans[height],node.Val)}dfs(node.Left,height+1)dfs(node.Right,height+1)}dfs(root,0)return
}
func max(a,b int)int{if a>b{return a}else{return b}
}
二、填充每个节点的下一个右侧节点指针

116.填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

广度优先搜素
/*** Definition for a Node.* type Node struct {*     Val int*     Left *Node*     Right *Node*     Next *Node* }*/func connect(root *Node) *Node {if root==nil{return root}curLevel:=[]*Node{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor i,node:=range temp{if i+1<len(temp){node.Next=temp[i+1]}if node.Left!=nil{curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}}return root
}
使用已建立的next 指针 

时间复杂度:O(N),每个节点只访问一次。

空间复杂度:O(1),不需要存储额外的节点。

func connect(root *Node)*Node{if root==nil{return root}// 每次循环从该层的最左侧节点开始for leftmost:=root;leftmost.Left!=nil;leftmost=leftmost.Left{// 通过 Next 遍历这一层节点,为下一层的节点更新 Next 指针for node:=leftmost;node!=nil;node=node.Next{// 左节点指向右节点node.Left.Next=node.Rightif node.Next!=nil{// 右节点指向下一个左节点node.Right.Next=node.Next.Left}}}return root
}
三、填充每个节点的下一个右侧节点指针II

117.填充每个节点的下一个右侧节点指针II

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。

初始状态下,所有 next 指针都被设置为 NULL 。

广度优先搜素

一模一样的代码 注意curLevel和temp 不要写混了

func connect(root *Node) *Node {if root==nil{return root}curLevel:=[]*Node{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor i,node:=range temp{if i+1<len(temp){node.Next=temp[i+1]}if node.Left!=nil{curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}}return root
}
四、二叉树的最大深度

104.二叉树的最大深度

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

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

广度优先搜素
func maxDepth(root *TreeNode) int {var ans intif root==nil{return ans}curLevel:=[]*TreeNode{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor _,node:=range temp{if node.Left!=nil{ curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}ans++//记录深度,其他的是层序遍历的板子}return ans
}
深度优先搜索
func maxDepth(root *TreeNode)int{if root==nil{return 0}return max(maxDepth(root.Left),maxDepth(root.Right))+1
}
func max(a,b int)int{if a>b{return a}return b
}
五、二叉树的最小深度

111.二叉树的最小深度

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

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

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

广度优先搜素
func minDepth(root *TreeNode) int {var ans intif root==nil{return ans}curLevel:=[]*TreeNode{root}for len(curLevel)>0{temp:=curLevelcurLevel=nilfor _,node:=range temp{if node.Left==nil&&node.Right==nil{return ans+1}if node.Left!=nil{ curLevel=append(curLevel,node.Left)}if node.Right!=nil{curLevel=append(curLevel,node.Right)}}ans++}return ans
}
深度优先搜索
func minDepth(root *TreeNode)int{if root==nil{return 0}if root.Left==nil&&root.Right==nil{return 1}minD:=math.MaxInt32if root.Left!=nil{minD=min(minD,minDepth(root.Left))}if root.Right!=nil{minD=min(minD,minDepth(root.Right))}return minD+1
}func min(a,b int)int{if a<b{return a}return b
}

最后

即使感知自己身体的需求,不管是体力消耗还是脑力消耗,及时补充能量,吃饭,休息。

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

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

相关文章

算法基础:KMP算法详细详解

目录 1、几个最基本的概念 2、暴力算法 3、KMP算法 4、KMP代码实现 5、时间复杂度 1、几个最基本的概念 字符串的前缀&#xff1a; 主串&#xff08;目标串&#xff09;从索引0开始的子串被称为主串的前缀。 字符串的后缀&#xff1a; 主串从索引大于0的位置到结尾的子串…

【人工智能入门学习资料福利】

总目录如下&#xff08;部分截取&#xff09;&#xff1a; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1bfDVG-xcPR3f3nfBJXxqQQ?pwdifu6 提取码&#xff1a; ifu6

Sentinel在Spring Cloud中的流量控制与熔断降级:保障你的微服务稳定运行

在当今高度互联的世界中&#xff0c;微服务架构已成为构建稳健系统的基石。然而&#xff0c;随着系统复杂性的增加&#xff0c;高并发和异常情况下&#xff0c;保障服务稳定性变得尤为关键。本文将带你探索Spring Cloud中Sentinel框架的强大功能&#xff0c;它能够为你的微服务…

协程及运用

协程 使用方法一方法二网页下载中使用有返回值 实战图片实战 一个线程多个任务&#xff0c;线程由操作系统开启&#xff0c;比较耗资源。线程内合理分配任务&#xff0c;充分利用线程内的资源&#xff0c;一个任务io阻塞时&#xff0c;cpu处理其他非阻塞任务。 使用 方法一 i…

B站已经部分上线前台实名,如不同意实名,后期账号流量将收影响!

B站部分百万粉丝博主的主页显示账号运营人名字的政策是从10月31日开始的。当天&#xff0c;B站官方发布了《哔哩哔哩关于头部“自媒体”账号前台实名的公告》&#xff0c;表明了其前台实名制的实施计划。 B站部分上线前台实名的过程可以追溯到2021年。当时&#xff0c;中国政府…

window下杀指定端口进程

netstat -ano | findstr "8762" taskkill /pid 14992 /f

【LeetCode】144. 二叉树的前序遍历

144. 二叉树的前序遍历 难度&#xff1a;简单 题目 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]…

ARM裸机-18(SD卡启动)

1、主流的外存设备介绍 内存和外存的区别&#xff1a;一般是把这种RAM(random access memory&#xff0c;随机访问存储器&#xff0c;特点是任意字节读写&#xff0c;掉电丢失)叫内存&#xff0c;把ROM (read only memory&#xff0c;只读存储器&#xff0c;类似于Flash、SD卡之…

如何解决安卓手机无法预览pdf文件而是需要直接下载的问题

在开发中常常会遇到需要在一个应用里打开一份pdf文件并预览&#xff0c;经真机调试时发现在苹果手机上打开pdf文件能正常预览&#xff0c;但在安卓手机打开时却会需要我们下载才能预览&#xff0c;无法直接预览 为了解决这个问题&#xff0c;我们采用安装pdfH5插件的方式&…

计算机三级嵌入式知识总结(一)

一、ARM的七种异常类型 1、复位异常RESET “复位异常RESET”通常是指在电子设备或系统中发生了一个意外的复位或重启。这可能是由于硬件故障、软件问题或其他未知的原因引起的。当设备经历复位异常时&#xff0c;它可能会丢失正在进行的操作或设置&#xff0c;导致数据丢失或系…

LINUXZ

10.6.2 AT24C02 访问方法 设备地址 从芯片手册上可以知道&#xff0c;AT24C02 的设备地址跟它的 A2、A1、A0 引脚有关&#xff1a; 图 10.36 AT24C02 设备地址引脚配置 294 / 577 打开 I2C 模块的原理图&#xff1a; 开发板配套网盘资料\04_开发板原理图\ 04_Extend_modules\通…

SQL语句执行过程

一条 SQL 的执行过程可以大致分为以下几个步骤&#xff1a; 连接器&#xff1a; ○ 客户端与数据库建立连接&#xff0c;并发送 SQL 语句给数据库服务。 ○ 连接器验证客户端的身份和权限&#xff0c;确保用户有足够的权限执行该 SQL 语句。查询缓存&#xff1a; ○ 连接器首先…

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码

基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹰栖息算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹰栖息优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

Motion v5.6.7 苹果电脑上的视频编辑

Motion mac是一款运行在苹果电脑上的视频编辑软件&#xff0c;它能让您自定Final Cut Pro字幕、转场和效果。 它可以在2D或3D空间中创建您自己的精美炫目的动画&#xff0c;同时还能在您工作时提供实时反馈。广色域支持让你的动态图形更显出色光彩。3D文字功能经过优化增强&am…

01背包与完全背包学习总结

背包问题分类见下图 参考学习点击&#xff1a;代码随想录01背包讲解 01背包问题&#xff1a; 核心思路&#xff1a; 1、先遍历物品个数&#xff0c;再遍历背包容量。因为容量最先是最大的&#xff0c;往背包里放物品&#xff0c;所以背包容量在慢慢减少&#xff0c;但背包容量…

CentOS7 firewall使用(开放和禁止端口、端口转发)

安装 安装命令 yum install firewalld -y 使用命令 systemctl start firewalld ##开启防火墙systemctl stop firewalld ##关闭防火墙systemctl status firewalld ##查看防火墙状态firewall-cmd --reload ##重启防火墙systemctl enable firewalld ##设置开启启动systemctl …

共享内存原理介绍及简单使用

每当我们执行一个程序时&#xff0c;对于操作系统来讲就创建了一个进程,在这个过程中&#xff0c;伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。进程的内存空间是相互独立的&#xff0c;一般而言是不能相互访问的。但很多情况下进程间需要互相通信&#xff…

上海泗博MODBUS转PROFINET网关TS-180 网关连接LED显示屏应用案例

项目 常州某钢铁公司的轧钢车间为了更清晰地显示当天轧钢系统各环节的工作参数&#xff0c;如轧钢的日期、钢种、吐丝机设备运行情况等&#xff0c;引进了另一家为其定制的LED显示屏。轧钢系统各环节的设备参数通过西门子S7-1500PLC采集后&#xff0c;实时显示在LED显示屏上&am…

飞瓜数据B站丨B站UP主11月第3周榜单排行榜榜单(B站平台)发布!

飞瓜轻数发布2023年11月13日-11月19日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数、带货数据等维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营…

Linux网络——传输层

目录 一.再谈端口概念 二.UDP协议 1.UDP协议格式 2.UDP的特点 3.面向数据报 4.UDP的缓冲区 5.UDP使用注意事项 6.UDP协议在内核中的表现形式 7.基于UDP的应用层协议 三.TCP协议 1.TCP协议格式 2.TCP确认应答机制 3.超时重传机制 4.TCP报文六位标志位 5.滑动窗口 6…