给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例: 给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
二叉树的一些题,首先肯定会想到使用递归
/**
* @param {TreeNode} root
* @param {number} sum
* @return {boolean}
*/
var hasPathSum = function(root, sum) {
if(root === null) {
return false;
}
// 如果是叶子结点,则看该结点值是否等于剩下的 sum
if(root.left === null && root.right === null) {
return root.val === sum;
}
// 每次遍历一个结点都要减去自己的值后重新递归
return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
};
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
使用 递归 + 回溯 的思想 DFS 遍历整个二叉树求出每条目标路径
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} sum
* @return {number[][]}
*/
var pathSum = function(root, sum) {
// 设定一个结果数组result来存储所有符合条件的路径
const result = [];
if(root) {
getPath(root, sum, [], 0, result)
}
function getPath(root, sum, stack, curSum, result) {
// 设定一个栈stack来存储当前路径中的节点
// 从根结点开始深度优先遍历,每经过一个节点,将节点入栈
stack.push(root.val);
// 设定一个和curSum来标识当前路径之和
curSum += root.val;
// 到达叶子节点,且当前路径之和等于给定目标值,则找到一个可行的解决方案,将其加入结果数组
if(!root.left && !root.right && sum === curSum) {
result.push(stack.slice(0));
}
if(root.left) {
getPath(root.left, sum, stack, curSum, result)
}
if(root.right) {
getPath(root.right, sum, stack, curSum, result)
}
stack.pop()
}
return result;
};
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \ \
3 2 11
/ \ \
3 -2 1
返回 3。和等于 8 的路径有:
1. 5 -> 3
2. 5 -> 2 -> 1
3. -3 -> 11
深度优先遍历 + 递归
以每个节点为根节点,都算一遍路径和为sum的有几条,然后加起来。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} sum
* @return {number}
*/
var pathSum = function(root, sum) {
if(root === null) {
return 0;
}
// 以root为根的树中等于sum的路径树 = 左子树中的路径数 + 右子树中的路径数 + 以root为起点的路径数
return pathSum(root.left, sum) + pathSum(root.right, sum) + dfs(root, sum);
function dfs(root, sum) {
if(root === null) {
return 0;
}
sum-=root.val;
return (sum === 0 ? 1 : 0) + dfs(root.left, sum) + dfs(root.right, sum);
}
};