leetcode-二叉树中和为某一值的路径

276 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

题目描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

  • 示例 1:

1.png

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

2.png

输入: root = [1,2,3], targetSum = 5
输出: []
  • 示例 3:
输入: root = [1,2], targetSum = 0
输出: []
  • 提示:
树中节点总数在范围 `[0, 5000]` 内
`-1000 <= Node.val <= 1000`
`-1000 <= targetSum <= 1000`

实现思路

我们用回调对二叉树深度遍历进行探底,因为是个二叉树,for循环不用写了,直接按顺序对节点的左右子树进行dfs回调遍历直到当前节点没有左右子树,再将途经的val进行相加如果等于目标数则将其存入结果数组中。

整体流程:

  1. 创建结果集合res
  2. 定义回调函数dfs
  3. 定义节点集合arr用来存储途经节点的val
  4. 遍历节点的左右子树
  5. 到达终结回调条件(节点没有左右子树)然后再判断节点和是否符合目标值,符合则添加结果集合。
/**
 * 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} target
 * @return {number[][]}
 */
var pathSum = function(root, target) {
    let res = []
    let dfs = function (item, arr1) {
        let arr = Array.from(arr1)  //存储途经节点的val
        arr.push(item.val)
        item.left && dfs(item.left, arr)  //遍历左节点
        item.right && dfs(item.right, arr)  //遍历右节点节点
        if (!item.left && !item.right) {
            let sum = arr.reduce(function(prev, curr, idx, arr){ //节点集合求和
                return prev + curr;
              })
            if(sum == target) { //符合目标值
                res.push(arr)
            }
        }
    }
    if(!root) return []
    dfs(root, [])
    return res
};