16-树-路径总和 II

这是树的第16篇算法,力扣链接。

给你二叉树的根节点 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]]

比较上一节返回布尔值就可以了,这回可能复杂一点,我们需要额外存储路径信息,不过其实还好,我们增加一个空间来存储每次遍历的路径就好。

func pathSum(root *TreeNode, targetSum int) [][]int {
	if root == nil {
		return nil
	}

	var result [][]int
	stack := []*TreeNode{root}
	sumStack := []int{root.Val}
	paths := [][]int{{root.Val}}

	for len(stack) > 0 {
		node := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		currentSum := sumStack[len(sumStack)-1]
		sumStack = sumStack[:len(sumStack)-1]
		path := paths[len(paths)-1]
		paths = paths[:len(paths)-1]

		if node.Left == nil && node.Right == nil && currentSum == targetSum {
			result = append(result, append([]int{}, path...))
		}
		if node.Left != nil {
			stack = append(stack, node.Left)
			sumStack = append(sumStack, currentSum+node.Left.Val)
			newPath := append([]int{}, path...)
			newPath = append(newPath, node.Left.Val)
			paths = append(paths, newPath)
		}
		if node.Right != nil {
			stack = append(stack, node.Right)
			sumStack = append(sumStack, currentSum+node.Right.Val)
			newPath := append([]int{}, path...)
			newPath = append(newPath, node.Right.Val)
			paths = append(paths, newPath)
		}
	}
	return result
}

这里可以尝试递归来解决问题:

func pathSum(root *TreeNode, targetSum int) [][]int {
	var result [][]int
	var path []int
	findPaths(root, targetSum, path, &result)
	return result
}

func findPaths(node *TreeNode, sum int, path []int, result *[][]int) {
	if node == nil {
		return
	}
	path = append(path, node.Val)

	if node.Left == nil && node.Right == nil && node.Val == sum {
		*result = append(*result, append([]int(nil), path...))
	} else {
		findPaths(node.Left, sum-node.Val, path, result)
		findPaths(node.Right, sum-node.Val, path, result)
	}
	// path = path[:len(path)-1] // 这行代码是多余的,因为每次递归都会复制path
}

广度优先算法和深度优先算法逻辑一样,只不过取出数据的顺序不同:

func pathSum(root *TreeNode, targetSum int) [][]int {
	var result [][]int
	if root == nil {
		return result
	}
	queue := []*TreeNode{root}
	paths := [][]int{{root.Val}}
	sums := []int{root.Val}
	for len(queue) > 0 {
		node := queue[0]
		queue = queue[1:]
		path := paths[0]
		paths = paths[1:]
		sum := sums[0]
		sums = sums[1:]
		if node.Left == nil && node.Right == nil && sum == targetSum {
			result = append(result, append([]int{}, path...))
		}
		if node.Left != nil {
			queue = append(queue, node.Left)
			sums = append(sums, sum+node.Left.Val)
			newPath := append([]int{}, path...)
			newPath = append(newPath, node.Left.Val)
			paths = append(paths, newPath)
		}
		if node.Right != nil {
			queue = append(queue, node.Right)
			sums = append(sums, sum+node.Right.Val)
			newPath := append([]int{}, path...)
			newPath = append(newPath, node.Right.Val)
			paths = append(paths, newPath)
		}
	}
	return result
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Django后端开发——Django应用及分布式路由

文章目录 参考资料Django应用创建注册 分布式路由配置分布式路由Step1 - 主路由中调用include函数Step2 - 应用下配置urls.py 配置分布式路由的示例主路由中调用include函数应用下配置urls.py效果 练习创建应用news和sport在settings.py里进行注册urls.pynews下新建urls.py&…

论文精读--对比学习论文综述

InstDisc 提出了个体判别任务,而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果;同时提出了别的数据结构——Memory Bank来存储大量负样本;解决如何对特征进行动量式的更新 翻译: 有监督学习的…

解决Webstorm2023使用账号连接GitLab的问题personal access token instead of a password

问题 升级Webstorm之后,发现gitlab仓库拉取代码报错 报错信息 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https…

人工智能技术应用笔记(二):OpenAI SORA文生视频模型技术报告全文中英对照 (GPT4翻译+人工润色)

目录 Video generation models as world simulators(视频生成模型作为世界模拟器) Turning visual data into patches (将视觉数据转换为图像块) Video compression network (视频压缩网络) Spacetim…

解决elementUI固定列后,下方多了一条横线的问题

最近遇到一个bug,如下图,el-table的操作列使用fixed属性固定后,下方多了一条横线: 我们将样式设置高优先,以覆盖内联样式,如下是less里使用穿透样式解决的办法: <style lang="less" scoped> /deep/ .el-table__fixed-right {height: 100

AI智能电话语音通话销售机器人源码,附带系统搭建教程

智能电话语音销售机器人——高效筛选与跟进客户的利器 在快节奏的商业战场上&#xff0c;迅速准确地把握每一个潜在客户是企业制胜的关键。我们的智能电话语音销售机器人正是这样一款能够助力企业轻松应对海量客户数据&#xff0c;实现高效筛选与跟进的利器。 通过简单的资料…

C语言第二十七弹---内存函数

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数&…

关于项目中websocket的socket.io客户端js库的应用

1.如何使用客户端js库? pnpm add socket.io-client2.如何建立连接&#xff1f; import io from socket.io-client // 参数1&#xff1a;不传默认是当前服务域名&#xff0c;开发中传入服务器地址 // 参数2&#xff1a;配置参数&#xff0c;根据需要再来介绍 const socket i…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

vscode突然连不上服务器了,以前都可以的,并且ssh等其它方式是可以连接到服务器的

过完年回来准备开工干活&#xff0c;突然发现vscode连不上服务器了&#xff0c;奇了怪了&#xff0c;年前都可以的&#xff0c;看了一下报错&#xff0c;如下&#xff0c; 以为是服务器挂了&#xff0c;结果执行ssh xxxxxx 发现是可以远程连接的&#xff0c;看来服务器没有问题…

2 分钟,了解 4 个极为有用的 MetricsQL 函数

夜莺社区的朋友如果问时序库的选型&#xff0c;我一般都会推荐 VictoriaMetrics&#xff0c;除了其性能、稳定性、集群扩展能力之外&#xff0c;VictoriaMetrics 还扩展了 PromQL&#xff0c;提供了 MetricsQL&#xff0c;即增强了 PromQL 的能力。比如下面介绍的场景&#xff…

C++学习:list

1.list的定义和结构 list的使用频率不高&#xff0c;在做题时几乎遇不到需要使用list的情景。list是一种双向链表容器&#xff0c;它是标准模板库(STL)提供的一种序列容器。list容器以节点(node的形式存储元素&#xff0c;并使用指针将这些节点链接在一起&#xff0c;形成一个…

算法沉淀——BFS 解决最短路问题(leetcode真题剖析)

算法沉淀——BFS 解决最短路问题&#xff08;leetcode真题剖析&#xff09; 01.迷宫中离入口最近的出口02.最小基因变化03.单词接龙04.为高尔夫比赛砍树 BFS&#xff08;广度优先搜索&#xff09;是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来…

数据结构中图的概念以及遍历算法的实现

在数据结构中&#xff0c;图&#xff08;Graph&#xff09;是由节点&#xff08;Vertex&#xff09;和连接节点的边&#xff08;Edge&#xff09;组成的一种非线性数据结构。图可以用来表示各种实际问题中的关系和连接&#xff0c;如社交网络、道路网络、电路等。 图由两个主要…

NX/UG二次开发—CAM—平面铣边界准确设置方法

大家在对平面铣设置边界时&#xff0c;经常遇到边界方向与自己期望的不一致&#xff0c;有些人喜欢用检查刀路是否过切来判断&#xff0c;但是对于倒角、负余量等一些情况&#xff0c;刀路本来就是过切的。对于多边界&#xff0c;可以根据选择的曲线来起点和面的方向来确定&…

go redis

go redis 快速入门 安装&#xff1a; go get github.com/redis/go-redis/v9然后创建客户端&#xff1a; package mainimport "github.com/redis/go-redis/v9"func main() {rdb : redis.NewClient(&redis.Options{Addr: "47.109.87.142:6379",Pa…

docker ubuntu tomcat 换源 安装软件

第一种办法参考docker中ubuntu容器更换apt源_ubuntu更改apt源 with dockerfile-CSDN博客 sed -i s/archive.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list sed -i s/security.ubuntu.com//mirrors.aliyun.com/g /etc/apt/sources.list apt update apt install vim…

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)

1. 目的&#xff1a;简单监控pod 我想使用java监控k8s pod的资源的简单使用情况&#xff0c;但是k8s内部并没有采集资源的实现。 但是k8s提供了一套k8s的对接标准&#xff0c;只要适配这套标准&#xff0c;就可以通过kubelet采集资源数据&#xff0c;并且通过k8s api服务器输出…

甲醇汽车产量不断增加 行业发展面临一定困难和挑战

甲醇汽车产量不断增加 行业发展面临一定困难和挑战 甲醇汽车是指以甲醇作为主要或者唯一燃料的汽车。与传统汽车相比&#xff0c;甲醇汽车具有节能减排、使用成本低、有害气体排放量少等优点&#xff0c;能够有效缓解能源紧缺及环境污染问题。 从上游市场来看&#xff0c;甲醇…

软考30-上午题-数据结构-小结

一、杂题汇总 真题1&#xff1a; 有向图——AOV 带权有向图——AOE 真题2&#xff1a; 二叉排序树&#xff1a;左子树< 根节点 < 右子树。 二叉排序树中序遍历&#xff0c;节点关键字有序&#xff08;递增&#xff09;&#xff1b; 关键字初始序列有序&#xff0c;二叉树…