【一天一大 lee】路径总和 II (难度:中等) - Day20200926
时间:2022-07-26
本文章向大家介绍【一天一大 lee】路径总和 II (难度:中等) - Day20200926,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:[1]
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:给定如下二叉树,以及目标和 sum = 22,
5
/
4 8
/ /
11 13 4
/ /
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
抛砖引玉
抛砖引玉
思路
递归回溯:在遍历子树时,可以选择右节点也可以选择左节点,那么在二叉树遍历的基础上再加上回溯的逻辑。
深度优先搜索(DFS)
DFS 模板:
function dfs(node) {
if (node == null) return
dfs(node.left)
dfs(node.right)
}
题目要求记录的是从根节点到叶子节点的和满足条件,那么在遍历的工程中需要记录的值就包含:
- 遍历的节点 path(用于输出到结果数组)
- 遍历的选择的节点的和 num(用于校验是否满足条件)
回溯
- 路径回溯,回到上轮选择节点前,path.pop()
- 节点和回溯,回到上轮选择节点前的和
var pathSum = function(root, sum) {
let _result = [],
path = [],
num = 0
if (root === null) return _result
function dfs(node) {
if (node === null) return
path.push(node.val)
num = num + node.val
if (node.left === null && node.right === null && num === sum) {
_result.push([...path])
}
dfs(node.left)
dfs(node.right)
path.pop()
num = num - node.val
}
dfs(root, 0)
return _result
}
广度优先搜索(BFS)
BFS 模板:
function(root) {
if (root == null) return
let queue = [root]
while(queue.length){
let node = queue.pop();
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
}
BFS 的逻辑可以不用回溯,直接正常遍历遍历到结束时如果有满足条件的路径就返回:
- 记录遍历过程中的节点和- queueSum
- 记录遍历的路径-map
- 使用哈希追溯父节点
var pathSum = function(root, sum) {
let _result = [],
map = new Map(),
queueNode = [root],
queueSum = [0]
if (root === null) return []
while (queueNode.length) {
let node = queueNode.pop(),
num = queueSum.pop() + node.val
if (node.left == null && node.right == null) {
// 满足要求,追溯父节点
if (num == sum) getPath(node)
} else {
if (node.left != null) {
map.set(node.left, node)
queueNode.push(node.left)
queueSum.push(num)
}
if (node.right != null) {
map.set(node.right, node)
queueNode.push(node.right)
queueSum.push(num)
}
}
}
function getPath(node) {
let temp = []
while (node != null) {
temp.push(node.val)
node = map.get(node)
}
temp.reverse()
_result.push(temp)
}
return _result.reverse()
}
- Elasticsearch全文检索实战小结——复盘我带的第二个项目
- 当12C PDB遇上JDBC (r10笔记第59天)
- 微信公众平台开发获取用户基本信息--转
- Elasticsearch检索分类深入详解—基础篇
- 通过Java程序测试数据库连接信息 (r10笔记第64天)
- GoldenGate安装简记(r10笔记第78天)
- 【Go 语言社区】各种变量的声明
- 【Go 语言社区】Golang 高效字符串拼接
- 实战 | Elasticsearch实现类Google高级检索
- Golang中time包用法--转
- 干货 | Elasticsearch 集群健康值红色终极解决方案
- Go语言interface的value.(type)使用小技巧-转
- 干货 | Elasticsearch5.X Mapping万能模板
- MySQL 5.7安装部署总结(r10笔记第77天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法