# 112.路径总和

# 标签:二叉树、深度优先搜索

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。

叶子节点 是指没有子节点的节点。

示例1

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
1
2

# 题解:

注意本题的要求是,询问是否有从根节点到某个叶子节点经过的路径上的节点之和等于目标值。

核心的思想是对树进行一次遍历,在遍历时候记录从根节点到当前节点的路径和,防止重复计算。

需要注意的是,给定的root可能为空。

方法一:广度优先搜索

首先我们可以想到使用广度优先搜索的方式,记录从根节点到当前节点的路径和,以防重复计算。这样我们就需要使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function (root, targetSum) {
  if (root === null) {
    return false
  }
  // 两个辅助队列 一个存放节点 一个存放路径和的值
  let queNode = [];
  let queVal = [];

  // 首先将根节点的值放进去 入队
  queNode.unshift(root)
  queVal.unshift(root.val)
  // 迭代遍历
  while (queNode.length > 0) {
    let now = queNode.pop()
    let temp = queVal.pop()
    
    if (now.left === null && now.right === null) {
      if(temp === targetSum) {
        return true
      }
    }
    if(now.left !== null) {
      queNode.unshift(now.left)
      queVal.unshift(now.left.val + temp)
    }
    if(now.right !== null) {
      queNode.unshift(now.right)
      queVal.unshift(now.right.val + temp)
    }
  }
  return false
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
最后更新时间: 3/28/2022, 7:07:04 AM