力扣112,113 路经总和(深度遍历解法)

112. 路径总和 - 力扣(LeetCode)

113. 路径总和 II - 力扣(LeetCode)

这俩道题都是使用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;
};

// 递归下一个结点时,同时传入计算当前结点路径累加和 与 递归到该节点时的路径数组
// 此结点独有该节点之前的路径累加和 与 路径数组,不受下一个递归结点的影响 

// 当结点左叶子结点递归完 不断返回,开始递归该结点右叶子结点时,路径累加和还是当时的路径和
// 不会因之前遍历到了该结点左子树而影响右子树累加和 与 路径数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值