学习算法,锻炼自我!记录自己的成长过程!
给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
这道题与112,113相似,但是却无法直接使用迭代来解决,因为前两道题都是从头遍历到尾的,而这道可以从中间某个节点开始遍历,所以这里使用递归。
从LeetCode截下一个图方便观察(找到结果为8的路径有多少个,3个)
var pathSum = function (root, targetSum) {
if (!root) {
return 0;
};
let count = 0;
const dfs = (r, total) => {
if (total === targetSum) {
count++;
};
const left = r.left;
const right = r.right;
//因为可以从中间某节点开始遍历其中某节点可能会被遍历多次
//所以需要记录某个节点已经被访问,以防止被再次访问
if (left && !left.visited) {
left.visited = true;
//从某个节点重新开始计算
dfs(left, left.val);
};
if (right && !right.visited) {
right.visited = true;
//从某个节点重新开始计算
dfs(right, right.val);
};
//为什么这不需要是否被判断呢
//因为这里是累加节点的值,我们从上个节点累加下来的
if (left) {
//累加节点的值
dfs(left, left.val + total);
};
if (right) {
//累加节点的值
dfs(right, right.val + total);
};
};
dfs(root, root.val);
return count;
};