【算法18天:Day18】第六章二叉树 LeetCode 路径总和(112)

54 阅读2分钟

题目二:

image.png

解法一:(递归)

解题思路:我的思路就是递归求和,到达叶子节点时,就判断路径和是否等于目标值,如果相等则返回true,如果当前结点为null时,表明位于根节点时,并无返回true,也就是不等于目标值,因此到达叶子结点的孩子结点后,应该返回false。

注意:以前我想着js好像没有对于返回值有要求,知道此刻,我写出了这样的代码:

isHasPathSum(cur.left, sum)
isHasPathSum(cur.right, sum)

最终应该为这样的代码:

return isHasPathSum(cur.left, sum) || isHasPathSum(cur.right, sum)

我才猛然意识到,js递归应该也要考虑返回值,不然我只是对其单纯调用,而没有返回结果。

var hasPathSum = function(root, targetSum) {
    var isHasPathSum = function(cur, sum) {
        if (cur === null) return false
        sum += cur.val
        if (cur.left === null && cur.right === null && sum === targetSum) {
            return true
        }
        return isHasPathSum(cur.left, sum) || isHasPathSum(cur.right, sum)
    }
    return isHasPathSum(root, 0)
};

参考代码随想录:

/**
 * @param {treenode} root
 * @param {number} targetsum
 * @return {boolean}
 */
let haspathsum = function (root, targetsum) {
  // 递归法
  const traversal = (node, cnt) => {
    // 遇到叶子节点,并且计数为0
    if (cnt === 0 && !node.left && !node.right) return true;
    // 遇到叶子节点而没有找到合适的边(计数不为0),直接返回
    if (!node.left && !node.right) return false;

    //  左(空节点不遍历).遇到叶子节点返回true,则直接返回true
    if (node.left && traversal(node.left, cnt - node.left.val)) return true;
    //  右(空节点不遍历)  
    if (node.right && traversal(node.right, cnt - node.right.val)) return true;
    return false;
  };
  if (!root) return false;
  return traversal(root, targetsum - root.val);

  // 精简代码:
  if (!root) return false;
  if (!root.left && !root.right && targetsum === root.val) return true;
  return haspathsum(root.left, targetsum - root.val) || haspathsum(root.right, targetsum -root.val);
};

解法二:(迭代)

参考代码随想录~

let hasPathSum = function(root, targetSum) {
    if(root === null) return false;
    let nodeArr = [root];
    let valArr = [0];
    while(nodeArr.length) {
        let curNode = nodeArr.shift();
        let curVal = valArr.shift();
        curVal += curNode.val;
        // 为叶子结点,且和等于目标数,返回true
        if (curNode.left === null && curNode.right === null && curVal === targetSum) {
            return true;
        }
        // 左节点,将当前的数值也对应记录下来
        if (curNode.left) {
            nodeArr.push(curNode.left);
            valArr.push(curVal);
        }
        // 右节点,将当前的数值也对应记录下来
        if (curNode.right) {
            nodeArr.push(curNode.right);
            valArr.push(curVal);
        }
    }
    return false;
};