• Leetcode刷题112. 路径总和


     给你二叉树的根节点 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
    解释:由于树是空的,所以不存在根节点到叶子节点的路径。

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/path-sum
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    感谢大神windliang的详细解法,传送门详细通俗的思路分析,多解法

    1. class Solution {
    2. public boolean hasPathSum(TreeNode root, int targetSum) {
    3. // return hasPathSumI(root, targetSum);
    4. // return hasPathSumII(root, targetSum);
    5. // return hasPathSumIII(root, targetSum);
    6. return hasPathSumIIII(root, targetSum);
    7. }
    8. //方法四:利用栈后序遍历,进栈时,剩余路径和加;出栈时,剩余路径和减
    9. //遍历到叶子节点时,计算的路径和是包含整条路径各节点的
    10. //时间和空间复杂度O(N)
    11. private boolean hasPathSumIIII(TreeNode root, int targetSum) {
    12. if (root == null) {
    13. return false;
    14. }
    15. Stack stack = new Stack<>();
    16. TreeNode prev = null;
    17. int curSum = 0;
    18. while (!stack.isEmpty() || root != null) {
    19. while (root != null) {
    20. stack.push(root);
    21. //入栈时,相加
    22. curSum += root.val;
    23. root = root.left;
    24. }
    25. TreeNode node = stack.peek();
    26. if (node.left == null && node.right == null && curSum == targetSum) {
    27. return true;
    28. }
    29. if (node.right != null && node.right != prev) {
    30. root = node.right;
    31. } else {
    32. TreeNode pop = stack.pop();
    33. //出栈时,减去
    34. curSum -= pop.val;
    35. prev = node;
    36. }
    37. }
    38. return false;
    39. }
    40. //方法三:BFS遍历,定义两个队列,一个进行层序遍历,一个记录根节点到当前节点的累加的和
    41. //时间和空间复杂度O(N)
    42. private boolean hasPathSumIII(TreeNode root, int targetSum) {
    43. if (root == null) {
    44. return false;
    45. }
    46. Queue queue = new LinkedList<>();
    47. Queue queueVal = new LinkedList<>();
    48. queue.offer(root);
    49. queueVal.offer(root.val);
    50. while (!queue.isEmpty()) {
    51. int size = queue.size();
    52. while (size-- > 0) {
    53. TreeNode node = queue.poll();
    54. Integer curVal = queueVal.poll();
    55. if (node.left == null && node.right == null && curVal == targetSum) {
    56. return true;
    57. }
    58. if (node.left != null) {
    59. queue.offer(node.left);
    60. queueVal.offer(curVal + node.left.val);
    61. }
    62. if (node.right != null) {
    63. queue.offer(node.right);
    64. queueVal.offer(curVal + node.right.val);
    65. }
    66. }
    67. }
    68. return false;
    69. }
    70. //方法二:递归,时间和空间复杂度O(N)
    71. //根据题意hasPathSum(root, sum)为求解从root到叶子节点的是否存在路径和为sum的路径
    72. //可以转换成求解从root.left或root.right到叶子节点是否存在路径和为sum-root.val的路径
    73. private boolean hasPathSumII(TreeNode root, int targetSum) {
    74. if (root == null) {
    75. return false;
    76. }
    77. //到达叶子节点
    78. if (root.left == null && root.right == null) {
    79. return targetSum == root.val;
    80. }
    81. return hasPathSumII(root.left, targetSum - root.val)
    82. || hasPathSumII(root.right, targetSum - root.val);
    83. }
    84. //方法一:递归,定义全局变量,遍历二叉树
    85. //时间和空间复杂度O(N)
    86. boolean hasPathSum = false;
    87. private boolean hasPathSumI(TreeNode root, int targetSum) {
    88. if (root == null) {
    89. return false;
    90. }
    91. traverse(root, targetSum, 0);
    92. return hasPathSum;
    93. }
    94. private void traverse(TreeNode root, int targetSum, int sum) {
    95. sum += root.val;
    96. if (root.left == null && root.right == null && sum == targetSum) {
    97. hasPathSum = true;
    98. return;
    99. }
    100. if (root.left != null) {
    101. traverse(root.left, targetSum, sum);
    102. }
    103. if (root.right != null) {
    104. traverse(root.right, targetSum, sum);
    105. }
    106. }
    107. }

  • 相关阅读:
    dubbo的负载均衡策略之RandomLoadBalance加权随机策略源码分析
    SSM整合Thymeleaf时,抽取公共页面并向其传递参数
    最大路径和
    RT-Thread STM32F407 PWM
    两日总结十三
    form-create的基本使用
    任务调度框架-如何实现定时任务+RabbitMQ事务+手动ACK
    Proteus仿真--从左往右流水灯仿真(仿真文件+程序)
    SpringBoot实现过滤器
    C语言volatile关键字
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/127819903