这俩道题都是使用DFS深度遍历算法求解的,一个是单纯求路径和,一个是求满足条件的路径。
关键是怎么解决同一结点的左右叶子结点的路径和路径和计算问题。
比如我到了 7 这个叶子结点,将 7 进行了累加路径和或者推入了路径数组,但是发现它不是满足条件的叶子结点路径,怎么消除该叶子结点的影响继续 2 这个右叶子结点呢?
技巧:DFS深度遍历函数的参数不仅仅是下一个结点,再额外传入当前结点的路径累加值和路径数组。
112题解代码
// 112的题解
var hasPathSum = function (root, targetSum) {
if (!root) return false;
let res = false;
const dfs = (n, sum) => {
if (!n.left && !n.right && sum === targetSum) {
res = true;
}
if (n.left) {
// 递归下一个结点的时候,同时累加结点路径和
// 这样这个路径和就是这个结点独有的
dfs(n.left, sum + n.left.val);
}
if (n.right) {
// 当左树结点递归完 不断返回,开始递归右树结点时,路径累加和还是当时的路径和
// 不会因之前遍历到了该结点左子树而影响右子树累加和
dfs(n.right, sum + n.right.val);
}
}
dfs(root, root.val);
return res;
};
// 每次递归下一个结点的时候,同时传入累加结点路径和
// 这样这个路径和就是这个结点独有的
// 当结点左叶子结点递归完 不断返回,开始递归该结点右叶子结点时,路径累加和还是当时的路径和
// 不会因之前遍历到了该结点左子树而影响右子树累加和
113题解代码
var pathSum = function (root, targetSum) {
if(!root) return [];
let res = [];
const dfs = (n, sum, arr) => {
arr.push(n.val);
if (!n.left && !n.right && sum === targetSum) {
res.push(arr)
}
if (n.left) {
// 递归下一个结点时,同时传入计算当前结点路径累加和 与 递归到该节点时的路径数组
// 此结点唯一拥有该节点之前的路径累加和 与 路径数组,不受下一个递归结点的影响
dfs(n.left, sum + n.left.val, arr.slice());
}
if (n.right) {
dfs(n.right, sum + n.right.val, arr.slice());
}
}
dfs(root, root.val, []);
return res;
};
// 递归下一个结点时,同时传入计算当前结点路径累加和 与 递归到该节点时的路径数组
// 此结点独有该节点之前的路径累加和 与 路径数组,不受下一个递归结点的影响
// 当结点左叶子结点递归完 不断返回,开始递归该结点右叶子结点时,路径累加和还是当时的路径和
// 不会因之前遍历到了该结点左子树而影响右子树累加和 与 路径数组