题目描述
解题思路
DFS是解决这个问题的核心思路。
- 首先判断传入的节点是否为空,如果为空,则返回空数组。
- 定义DFS函数(节点,某条路径上剩余的和,临时数组)
- 进入DFS函数就让临时数组收录当前节点的值。
- 如果当前节点是叶子节点,并且剩余和与当前的值一致,则将临时数组放入结果数组中。
- 如果左子节点存在就让左子节点,新的剩余和,临时数组的副本进入DFS函数。
- 如果右子节点存在就让右子节点,新的剩余和,临时数组的副本进入DFS函数。
AC代码
var pathSum = function(root, targetSum) {
// 路径总和无论是I还是II都是面试的常考题,尤其是这个II被快手考到了
// 核心解题思路就是DFS
const res = [];
if (!root) return [];
function dfs(node,sum,temp) {
temp.push(node.val);
if (!node.left && !node.right && sum === node.val) {
res.push(temp);
return;
}
if (node.left) {
dfs(node.left,sum - node.val,temp.slice());
}
if (node.right) {
dfs(node.right,sum- node.val,temp.slice());
}
};
dfs(root,targetSum,[]);
return res;
};
总结与思考
路径总和II对应着剑指Offer中的二叉树中和为某一值得路径,这道题目是各个大厂的高频考题,是我们必须熟练掌握的题目,我们不仅要能做出来这个题目,还要深刻理解DFS深度优先遍历的思想。其实这道题目我们还可以和路径总和I进行对比,我们可以发现这道题完全可以去解决那个题目,因为加入res为空则返回false,不为空则说明存在这样的路径,则返回true。