Golang每日一练(leetDay0038) 二叉树专题(7)

news2024/11/27 11:35:40

 

目录

112. 路径总和 Path Sum  🌟

113. 路径总和 II Path Sum II  🌟🌟

114. 二叉树展开为链表 Flatten Binary Tree to Linked-list  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


二叉树专题(7)

112. 路径总和 Path Sum

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

  • 树中节点的数目在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

代码:

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func hasPathSum(root *TreeNode, targetSum int) bool {
	sum := func(arr []int) int {
		res := 0
		for i := 0; i < len(arr); i++ {
			res += arr[i]
		}
		return res
	}
	for _, path := range binaryTreePaths(root) {
		if sum(path) == targetSum {
			return true
		}
	}
	return false
}

func binaryTreePaths(root *TreeNode) [][]int {
	res := [][]int{}
	if root == nil {
		return res
	}
	if root.Left == nil && root.Right == nil {
		return [][]int{{root.Val}}
	}
	leftPaths := binaryTreePaths(root.Left)
	rightPaths := binaryTreePaths(root.Right)

	paths := make([][]int, 0)
	for _, path := range leftPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	for _, path := range rightPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	return paths
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1}
	root := buildTree(nums)
	fmt.Println(hasPathSum(root, 22))
	nums2 := []int{1, 2, 3}
	root = buildTree(nums2)
	fmt.Println(hasPathSum(root, 5))
	nums3 := []int{}
	root = buildTree(nums3)
	fmt.Println(hasPathSum(root, 0))
}

输出:

true
false
false


113. 路径总和 II Path Sum II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

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

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

提示:

  • 树中节点总数在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

代码:

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func pathSum(root *TreeNode, targetSum int) [][]int {
	res := [][]int{}
	sum := func(arr []int) int {
		res := 0
		for i := 0; i < len(arr); i++ {
			res += arr[i]
		}
		return res
	}
	for _, path := range binaryTreePaths(root) {
		if sum(path) == targetSum {
			res = append(res, append([]int{}, path...))
		}
	}
	return res
}

func binaryTreePaths(root *TreeNode) [][]int {
	res := [][]int{}
	if root == nil {
		return res
	}
	if root.Left == nil && root.Right == nil {
		return [][]int{{root.Val}}
	}
	leftPaths := binaryTreePaths(root.Left)
	rightPaths := binaryTreePaths(root.Right)

	paths := make([][]int, 0)
	for _, path := range leftPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	for _, path := range rightPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	return paths
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1}
	root := buildTree(nums)
	fmt.Println(pathSum(root, 22))
	nums2 := []int{1, 2, 3}
	root = buildTree(nums2)
	fmt.Println(pathSum(root, 5))
	nums3 := []int{1, 2}
	root = buildTree(nums3)
	fmt.Println(pathSum(root, 0))
}

输出:

[[5 4 11 2] [5 8 4 5]]
[]
[]

以上两题都用到了遍历出所有路径的函数 func binaryTreePaths(root *TreeNode) [][]int

package main

import (
	"fmt"
)

const null = -1 << 31

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func binaryTreePaths(root *TreeNode) [][]int {
	res := [][]int{}
	if root == nil {
		return res
	}
	if root.Left == nil && root.Right == nil {
		return [][]int{{root.Val}}
	}
	leftPaths := binaryTreePaths(root.Left)
	rightPaths := binaryTreePaths(root.Right)

	paths := make([][]int, 0)
	for _, path := range leftPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	for _, path := range rightPaths {
		paths = append(paths, append([]int{root.Val}, path...))
	}
	return paths
}

func buildTree(nums []int) *TreeNode {
	if len(nums) == 0 {
		return nil
	}
	root := &TreeNode{Val: nums[0]}
	Queue := []*TreeNode{root}
	idx := 1
	for idx < len(nums) {
		node := Queue[0]
		Queue = Queue[1:]
		if nums[idx] != null {
			node.Left = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Left)
		}
		idx++
		if idx < len(nums) && nums[idx] != null {
			node.Right = &TreeNode{Val: nums[idx]}
			Queue = append(Queue, node.Right)
		}
		idx++
	}
	return root
}

func main() {
	nums := []int{5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1}
	root := buildTree(nums)
	fmt.Println(binaryTreePaths(root))
}

 输出:

[[5 4 11 7] [5 4 11 2] [5 8 13] [5 8 4 5] [5 8 4 1]]


114. 二叉树展开为链表 Flatten Binary Tree to Linked-list

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [0]
输出:[0]

提示:

  • 树中结点数在范围 [0, 2000] 内
  • -100 <= Node.val <= 100

进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?

代码:

func flatten(root *TreeNode) {
list, cur := []int{}, &TreeNode{}
preorder(root, &list)
cur = root
for i := 1; i < len(list); i++ {
cur.Left = nil
cur.Right = &TreeNode{Val: list[i], Left: nil, Right: nil}
cur = cur.Right
}
return
}


func flatten1(root *TreeNode) {
if root == nil || (root.Left == nil && root.Right == nil) {
return
}
flatten(root.Left)
flatten(root.Right)
currRight := root.Right
root.Right = root.Left
root.Left = nil
for root.Right != nil {
root = root.Right
}
root.Right = currRight
}


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

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

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

相关文章

Nacos作为注册中心和配置中心

Cloud依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><sco…

圣戈班Saint-Gobain EDI需求分析

圣戈班Saint-Gobain&#xff08;以下简称&#xff1a;圣戈班&#xff09;是一家总部位于法国的跨国公司&#xff0c;成立于1665年。它是全球领先的建筑和高性能材料解决方案提供商之一&#xff0c;产品包括玻璃、陶瓷、管道、密封材料等&#xff0c;在欧洲、北美、亚洲和南美等…

【软件测试】可以写进简历的项目巨真实

昨天逛帖子&#xff0c;看到有自学软件测试的同学苦恼于看书学习之后&#xff0c;学过的知识转瞬即忘&#xff0c;并且没有上手的测试项目&#xff0c;不管是知识巩固还是面试求职&#xff0c;都比较艰难。 其实&#xff0c;初次接触技术工作&#xff0c;遇到这样的困难是正常…

【数据结构】二叉树链式结构

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

【Linux】CentOS7.6 升级 gcc/g++

CentOS 7.6 升级 gcc/g的方法&#xff0c;不一定适用于其他linux系统 1.查看版本 g -v gcc -v当前查看版本&#xff0c;发现是4.8.5&#xff0c;这已经是2015年的旧版本了&#xff0c;对c11的支持不是很完善&#xff0c;为了方便学习和编写新版本的代码&#xff0c;升级一下还…

使用python采集分享119个PHP江湖论坛源码,总有一款适合您

分享119个PHP江湖论坛源码&#xff0c;总有一款适合您 119个PHP江湖论坛源码下载链接&#xff1a;https://pan.baidu.com/s/1Zz-GiS6WT3i16dZMz-5rvQ?pwdr416 提取码&#xff1a;r416 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 我的博客地址&#xff1a;…

【Unity URP】探讨描边方案 自定义后处理Volume

写在前面 本篇内容实现了在URP下获取深度、法线实现描边的后处理描边之前做的工作&#xff0c;包括讨论描边方案&#xff0c;以及写shader之前的自定义renderFeature和Volume组件的过程。 由于是想复刻《SCHiM》游戏里的画面风格&#xff0c;所以本篇文章的需求很明确&#x…

国网B接口调阅实时视频规范解读和代码示例分析

接口描述 国网B接口调阅实时视频&#xff0c;相关规范写的比较粗略&#xff1a; 调阅实时视频包括信令接口和媒体流接口&#xff0c;采用标准的SIP INVITESDP流程&#xff0c;媒体传输使用RTP/RTCP。 SDP 中 RTP Payload 的取值应遵守下面接口参数中的定义&#xff1a; a&a…

用低代码平台可视化设计表单

表单在前端可谓是非常常见的场景&#xff0c;而且通常需要花费开发非常多的时间来处理各种复杂的逻辑。特别是在企业中后台的业务中&#xff0c;存在着大量的表单&#xff0c;比如客户的订单&#xff0c;投诉的问题单&#xff0c;服务跟进过程每个流程的流转。凡是存在用户输入…

西安五日游规划

文章目录前言一、行前准备二、必带清单三、打卡美食四、景点地理坐标五、旅游时间轴六、景点小巴士第一天第二天第三天第四天第五天其他七、住宿八、小贴士总结前言 西安五日游。计划从北京出发&#xff0c;游玩五天&#xff0c;第五天回京。 一、行前准备 计划行程 票务预订 …

雅思资料汇总

关于雅思 流程&#xff1a; 雅思考试将全面启用现场照相和生物识别技术, 包括指纹采集和验证,考生将无需提供个人照片。我们建议考生在考试当天提前到场以完成个人物品放置&#xff0c;身份证件验证&#xff0c;检录入场等一系列重要考前准备工作。大厅在当天会贴出考生的考号…

【网络原理】应用层协议 与 传输层协议

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录&#x1f3c9;一. 应用层协议⚾️二. 传输层协议&#x1f452;1. UDP 协议&#x1f302;2. 校验和&#x1f453;3. TCP 协议&#x1f3c9;一. 应用层协议 我们自己写的应用程…

2023年MathorCup数模B题赛题

B 题 城市轨道交通列车时刻表优化问题 列车时刻表优化问题是轨道交通领域行车组织方式的经典问题之一。 列车时刻表规定了列车在每个车站的到达和出发(或通过)时刻&#xff0c;其在实 际运用过程中&#xff0c;通常用列车运行图来表示。图 1 为某一运行图的示例&#xff0c;图 …

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水

503. 下一个更大元素 II 方法一&#xff1a;将两个nums数组放在一起&#xff0c;使用单调栈求下一个更大元素&#xff0c;最后再把结果集即result数组resize到原数组大小就可以了。 方法二&#xff1a;在遍历的过程中模拟走了两遍nums class Solution { public:vector<in…

5G-OAI关于物理层中PDCCH源码解析

5G物理层是指5G网络的传输技术&#xff0c;包括无线帧、子帧、时隙、符号等方面的定义和规范。具体来说&#xff0c;5G物理层定义了无线帧的长度、帧结构、子帧结构、传输速率、带宽、时间同步等方面的参数&#xff0c;以及物理层信道的编码、调制和解调方式等方面的规范。5G物…

k8s 滚动部署学习总结

k8s 滚动部署学习总结 滚动发布 滚动发布配置总结 定义&#xff1a; 滚动升级&#xff08;Rolling update&#xff09; 就是指每次更新部分Pod&#xff0c;而不是在同一时刻将该Service下面的所有Pod shutdown&#xff0c;然后去更新逐个更新可以避免将业务中断 使用Deploy…

GEE初学者笔记之快速上手篇

1.基础概念 (1)谷歌云平台 整个GEE是基于Google Cloud云平台的一整套API开发环境。因此整个数据的处理全部都是在Google Cloud平台上实现的&#xff0c;无需本地机器参与运算。一般开发流程是在线/离线编辑代码&#xff0c;然后提交服务器端运行&#xff0c;完成之后会输出给我…

【Jenkins 2.x 实践指南】1.4 软件工程生产力--章节小结

目录 一、生产力三要素 1. 生产力 2. IT 中的生产力 二、Devops 和 Jenkins 1. DevOps 模式定义(AWS官方定义) 2. DevOps 实践经验 2.1 持续集成 2.2 持续交付 2.3 微服务 2.4 基础设施即代码 2.5 监控和日志记录 2.6 沟通与合作 一、生产力三要素 1. 生产力 劳动…

GPT系列简介与gpt训练(nanoGPT)

generateivelt pre-trained transformer ,GPT使用transformer做特征提取行&#xff0c;单项语言模型作为训练任务 gpt 1.0 通过自左向右生成式的构建预训练任务&#xff0c;然后得到一个通用的预训练模型&#xff0c;这个模型和BERT一样都可用来做下游任务的微调。GPT-1当时在…

Firefly-rk3288 开发板Linux系统编译

前言 手上的一块Firefly-RK3288开发板&#xff0c;看了下Firefly提供的SDK&#xff0c;压缩包就有15个多G&#xff0c;直接吓退。还好最近看到了韦东山老师提供的教学资料。记下学习步骤及遇到的问题解决办法。 1、开发环境 资料提供的有百问网制作的 ubuntu18.04 虚拟机镜像…