LeetCode - 112 - 路径总和(path-sum)

栏目: IT技术 · 发布时间: 4年前

内容简介:LeetCode - 112 - 路径总和(path-sum)

Create by jsliang on 2019-6-26 07:43:40
Recently revised in 2019-6-26 09:09:08

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | | 四 执行测试 | | 五 LeetCode Submit | | 六 解题思路 | | 七 进一步思考 |

二 前言

  • 难度:简单

  • 涉及知识:树、深度优先搜索

  • 题目地址:https://leetcode-cn.com/problems/path-sum/

  • 题目内容

  1. 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

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

  3. 示例: 

  4. 给定如下二叉树,以及目标和 sum = 22

  5. 5

  6. / \

  7. 4 8

  8. / / \

  9. 11 13 4

  10. / \ \

  11. 7 2 1

  12. 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  • 解题代码

  1. var hasPathSum = function(root, sum) {

  2. if (!root) {

  3. return false;

  4. }

  5. sum -= root.val;

  6. if (!root.left && !root.right) {

  7. return sum === 0;

  8. }

  9. return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);

  10. };

四 执行测试

  • sum: 18

  • root

  1. // 5

  2. // / \

  3. // 4 8

  4. // / / \

  5. // 11 13 4

  6. // / \ \

  7. // 7 2 1

  8. const root = {

  9. val: 5,

  10. left: {

  11. val: 4,

  12. left: {

  13. val: 11,

  14. left: { val: 7, left: null, right: null },

  15. right: { val: 2, left: null, right: null },

  16. },

  17. right: null,

  18. },

  19. right: {

  20. val: 8,

  21. left: { val: 13, left: null, right: null },

  22. right: {

  23. val: 4,

  24. left: null,

  25. right: { val: 1, left: null, right: null },

  26. }

  27. }

  28. }

  • return

  1. true

五 LeetCode Submit

  1. Accepted

  2. 114/114 cases passed (96 ms)

  3. Your runtime beats 91.36 % of javascript submissions

  4. Your memory usage beats 24.14 % of javascript submissions (37.3 MB)

六 解题思路

首先,我们尝试打印下递归路线:

  1. // root:

  2. // 5

  3. // / \

  4. // 4 8

  5. // / / \

  6. // 11 13 4

  7. // / \ \

  8. // 7 2 1

  9. //

  10. // sum:18

  11. var hasPathSum = function(root, sum) {

  12. if (!root) {

  13. return false;

  14. }

  15. sum -= root.val;

  16. console.log('------');

  17. console.log(root);

  18. console.log(sum);

  19. if (!root.left && !root.right) {

  20. return sum === 0;

  21. }

  22. return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);

  23. };

然后,其结果为:

  1. ------

  2. { val: 5,

  3. left:

  4. { val: 4,

  5. left: { val: 11, left: [Object], right: [Object] },

  6. right: null },

  7. right:

  8. { val: 8,

  9. left: { val: 13, left: null, right: null },

  10. right: { val: 4, left: null, right: [Object] } } }

  11. 13

  12. ------

  13. { val: 4,

  14. left:

  15. { val: 11,

  16. left: { val: 7, left: null, right: null },

  17. right: { val: 2, left: null, right: null } },

  18. right: null }

  19. 9

  20. ------

  21. { val: 11,

  22. left: { val: 7, left: null, right: null },

  23. right: { val: 2, left: null, right: null } }

  24. -2

  25. ------

  26. { val: 7, left: null, right: null }

  27. -9

  28. ------

  29. { val: 2, left: null, right: null }

  30. -4

  31. ------

  32. { val: 8,

  33. left: { val: 13, left: null, right: null },

  34. right:

  35. { val: 4,

  36. left: null,

  37. right: { val: 1, left: null, right: null } } }

  38. 5

  39. ------

  40. { val: 13, left: null, right: null }

  41. -8

  42. ------

  43. { val: 4,

  44. left: null,

  45. right: { val: 1, left: null, right: null } }

  46. 1

  47. ------

  48. { val: 1, left: null, right: null }

  49. 0

最后,看到这里,小伙伴就清楚了,这道题的解题思路!

七 进一步思考

有时候,很多小伙伴会说:哇,jsliang 又破解了一题,然而我看到题目就头痛!

其实,jsliang 有时候也感到烦恼,因为有些题目,非得看题解。

就好比目前这题,一开始我的思路跟题解是反过来的:

  1. // 5

  2. // / \

  3. // 4 8

  4. // / / \

  5. // 11 13 4

  6. // / \ \

  7. // 7 2 1

  8. const sum = 22

  9. const root = {

  10. val: 5,

  11. left: {

  12. val: 4,

  13. left: {

  14. val: 11,

  15. left: { val: 7, left: null, right: null },

  16. right: { val: 2, left: null, right: null },

  17. },

  18. right: null,

  19. },

  20. right: {

  21. val: 8,

  22. left: { val: 13, left: null, right: null },

  23. right: {

  24. val: 4,

  25. left: null,

  26. right: { val: 1, left: null, right: null },

  27. }

  28. }

  29. }

  30. var hasPathSum = function(root, sum) {

  31. if (!root) {

  32. return false;

  33. }

  34. let index = 0;

  35. let arr = [];

  36. let ergodic = function(root) {

  37. console.log('------');

  38. console.log(root);

  39. console.log(arr);

  40. if (!root) {

  41. return 0;

  42. }

  43. if (!arr[index]) {

  44. arr[index] = 0;

  45. }

  46. arr[index] += root.val;

  47. if (!root.left && !root.right) {

  48. // 找到叶子节点,开始逆推

  49. index += 1;

  50. return arr[index];

  51. }

  52. return ergodic(root.left) + ergodic(root.right);

  53. }

  54. ergodic(root);

  55. };

  56. hasPathSum(root, sum);

结果打印:

  1. ------

  2. { val: 5,

  3. left:

  4. { val: 4,

  5. left: { val: 11, left: [Object], right: [Object] },

  6. right: null },

  7. right:

  8. { val: 8,

  9. left: { val: 13, left: null, right: null },

  10. right: { val: 4, left: null, right: [Object] } } }

  11. []

  12. ------

  13. { val: 4,

  14. left:

  15. { val: 11,

  16. left: { val: 7, left: null, right: null },

  17. right: { val: 2, left: null, right: null } },

  18. right: null }

  19. [ 5 ]

  20. ------

  21. { val: 11,

  22. left: { val: 7, left: null, right: null },

  23. right: { val: 2, left: null, right: null } }

  24. [ 9 ]

  25. ------

  26. { val: 7, left: null, right: null }

  27. [ 20 ]

  28. ------

  29. { val: 2, left: null, right: null }

  30. [ 27 ]

  31. ------

  32. null

  33. [ 27, 2 ]

  34. ------

  35. { val: 8,

  36. left: { val: 13, left: null, right: null },

  37. right:

  38. { val: 4,

  39. left: null,

  40. right: { val: 1, left: null, right: null } } }

  41. [ 27, 2 ]

  42. ------

  43. { val: 13, left: null, right: null }

  44. [ 27, 2, 8 ]

  45. ------

  46. { val: 4,

  47. left: null,

  48. right: { val: 1, left: null, right: null } }

  49. [ 27, 2, 21 ]

  50. ------

  51. null

  52. [ 27, 2, 21, 4 ]

  53. ------

  54. { val: 1, left: null, right: null }

  55. [ 27, 2, 21, 4 ]

是的,这份遍历节点的,不完善,我想统计每个分支的和,但它遍历了一遍所有节点,却没做到统计和。

这时候,就涉及到知识盲区了,我知道有 4 条分支,但是如何将 4 条分支统计起来呢?为什么我可以求到所有节点的和,以及知道有 4 条分支,却不能统计 4 条分支的和呢?

抱着这种好奇心,我翻开了题解……


不折腾的前端,和咸鱼有什么区别!

LeetCode - 112 - 路径总和(path-sum)

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

LeetCode - 112 - 路径总和(path-sum)

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ACM/ICPC程序设计与分析

ACM/ICPC程序设计与分析

沈云付 / 清华大学 / 2010-7 / 39.50元

《ACM/ICPC程序设计与分析(C++实现)》介绍ACM国际大学生程序设计竞赛概况及程序设计基础,系统介绍数论、组合数学、动态规划、计算几何、搜索、图论和网络流等专题的典型算法,挑选历年竞赛中许多有代表性的竞赛题作为例题进行分析,便于学生编程时模仿学习。每章的例题和习题都配有输入输出样例,方便学生在编程时测试与调试程序。《ACM/ICPC程序设计与分析(C++实现)》以C++为程序设计语言,以提......一起来看看 《ACM/ICPC程序设计与分析》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试