题目二:
解法一:(递归)
解题思路:我的思路就是递归求和,到达叶子节点时,就判断路径和是否等于目标值,如果相等则返回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;
};