diff --git a/problems/0112.路径总和.md b/problems/0112.路径总和.md index 40df1e7a..718a2f5b 100644 --- a/problems/0112.路径总和.md +++ b/problems/0112.路径总和.md @@ -312,6 +312,74 @@ Python: Go: +JavaScript: + +0112.路径总和 + +```javascript +/** + * @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); +}; +``` + +0113.路径总和-ii + +```javascript +let pathSum = function (root, targetSum) { + // 递归法 + // 要遍历整个树找到所有路径,所以递归函数不需要返回值, 与112不同 + const res = []; + const travelsal = (node, cnt, path) => { + // 遇到了叶子节点且找到了和为sum的路径 + if (cnt === 0 && !node.left && !node.right) { + res.push([...path]); // 不能写res.push(path), 要深拷贝 + return; + } + if (!node.left && !node.right) return; // 遇到叶子节点而没有找到合适的边,直接返回 + // 左 (空节点不遍历) + if (node.left) { + path.push(node.left.val); + travelsal(node.left, cnt - node.left.val, path); // 递归 + path.pop(); // 回溯 + } + // 右 (空节点不遍历) + if (node.right) { + path.push(node.right.val); + travelsal(node.right, cnt - node.right.val, path); // 递归 + path.pop(); // 回溯 + } + return; + }; + if (!root) return res; + travelsal(root, targetSum - root.val, [root.val]); // 把根节点放进路径 + return res; +}; +``` +