一天一大 leet(路径总和)难度:简单-Day20200707
时间:2022-07-25
本文章向大家介绍一天一大 leet(路径总和)难度:简单-Day20200707,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径, 这条路径上所有节点值相加等于目标和。
说明
叶子节点是指没有子节点的节点。
示例
给定如下二叉树,以及目标和 sum = 22,
5
/
4 8
/ /
11 13 4
/
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
抛砖引玉
- 使用递归遍历二叉树
- 递归的逻辑:
- 参数上一个节点的左节点或者右节点,减去上一个节点的和
- 遇到叶子节点下一个节点终止
- sum 减去递归中遇到的节点,返回 sum 与最后的节点差值是否为 0
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} sum
* @return {boolean}
*/
var hasPathSum = function (root, sum) {
// 遍历到叶子节点下一个节点-终止递归
if (root === null) return false
// 遍历到叶子节点 判断剩余节点是否与和差值为0
if (root.left === null && root.right === null) {
return sum - root.val === 0
}
// sum一次减去该节点左节点、右节点 是否等于最后叶子节点
let left = hasPathSum(root.left, sum - root.val),
right = hasPathSum(root.right, sum - root.val)
// 存在一侧满足就满足
return left || right
}
官方答案
广度优先搜索
- 题目要求根节点到叶子节点所以如果每遍历一层节点时, 我们找到该层所以的节点,理论上任何一个节点我们都可以与上一节点累加去校验逻辑
- 现在的问题是,如果只单纯的存储每一层所以的节点,就都是了每个节点的父级节点,不知道了与谁相加
- 那么尝试在存入节点时就存入处理后的值(借助递归方法中使用的依次减掉已经遇到的节点)
代码实现
- 声明一个数组 stack 记录每层收集的节点,放入树形数据-第一层(栈-先入先出)
- 声明一个数组 sumStack 记录每层目标值与累加结果的差值
- 遍历 stack,只要这一层不全为 null,就一直遍历直到叶子节点终止
- 取出上一次节点,存入 stack 中节点的左右节点存入做下一层节点
- 判断 sumStack 存储的差值是否为 0,及为 0 是存入的节点是不是叶子节点
注意
stack 与 sumStack 的数据是一一对应的,遍历中会遍历所有节点及根节点到任意节点的差值
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} sum
* @return {boolean}
*/
var hasPathSum = function (root, sum) {
if (!root) return false
let stack = [root],
sumStack = [sum - root.val]
while (stack.length) {
let node = stack.pop(),
curSum = sumStack.pop()
if (curSum === 0 && !node.left && !node.right) {
return true
}
if (node.left) {
stack.push(node.left)
sumStack.push(curSum - node.left.val)
}
if (node.right) {
stack.push(node.right)
sumStack.push(curSum - node.right.val)
}
}
return false
}
- 联袂腾讯 “互联网+税务”创新模式在蒙启动
- 学医11年,终将被机器取代
- 大数据揭示:女性比男性更关注医改 建档等是热门话题
- 腾讯人工智能实验室AI Lab主任张潼博士前沿对话:AI如何助力营销?
- 当前所有源码链接
- Python入门基础连载(4)控制流
- 济西站构建大数据运营网络,打造智能化列车加工厂
- 五位数终端收购的域名dongxiao.cn已启用
- 全球互联网发展进入“拐点”——展望下一代互联网
- 2 分钟论文:语音生成表情包背后的技术原理
- 享学课堂谈-Python程序员的常见错误
- 区块链技术,如何提升网络安全?
- 趣店推“大白汽车”业务 启用域名dabaiqiche.com
- 糖果吃了那么多,你真的知道比特币分叉是咋回事吗?
- 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 数组属性和方法
- Java后端面试学习知识总结
- Spring框架源码脉络分析(一):IoC与容器、Bean和BeanDefinition
- Spring-Data-Redis 2.X以上版本使用心得和一些坑
- Java后端面试学习知识总结——数据库:MySQL
- Java 记一次自定义比较器中compareTo方法使用long强转int作为比较结果产生的bug
- SpringCloud 使用feign报错
- Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序
- 解决虚拟机Centos7 报错 curl#56
- Java 桶排序实现 如何判断该放到哪个桶里
- Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题
- 冒泡排序-排序算法
- Java中JDBC工具类封装
- 3.深入k8s:Deployment控制器
- 使用FreeSurfer进行脑区分割
- android 调试 adb