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

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

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

输入:root = [1,2,3], targetSum = 5
输出:[]

输入:root = [1,2], targetSum = 0
输出:[]
1
2
3
4
5
6
7
8

解题思路:

本问题是典型的二叉树方案的搜索问题,使用回溯法解决,包含先序遍历+路径记录两个部分。

  • 先序遍历:按照根、左、右的顺序,遍历树的所有节点
  • 路径记录:在先序遍历中,记录从根节点到当前节点的路径。当路径为结果刚好为目标值的时候。将这个路径加入结果列表。

算法流程: pathSum(root,sum)函数

  • 初始化: 结果列表 res 路径列表 path
  • 返回值:返回 res 即可

recur(root,tar) 函数

  • 递推参数 当前节点 root 当前目标值 tar
  • 终止条件:若节点 root 为空 则直接返回
  • 递推工作:
    • 路径更新:将当前的节点值 root.val 加入 path
    • 目标值更新:tar = tar - root.val
    • 路径记录:当路径和等于目标值,则将此路径path加入 res
    • 先序遍历:递归左右子节点
    • 路径恢复:向上回溯前,需要将当前节点从路径 path 中删除 执行 path.pop()
/**
 * 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) {
	if (!root) return [];
	let res = [];
  
  function dfs(node, sum, path) {
		if (!node) return false;
		
    let {left, right, val} = node;
		path.push(val);
		
    if (val === sum && !left && !right) res.push(path);
		
    dfs(left, sum - val, path.slice());
		dfs(right, sum - val, path.slice());
	}

	dfs(root, target, []);
	return res;
};
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
最后更新时间: 3/11/2022, 11:32:37 AM