题目:
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径, 这条路径上所有节点值相加等于目标和。
叶子节点是指没有子节点的节点。
给定如下二叉树,以及目标和 sum = 22,
5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @param {number} sum * @return {boolean} */ var hasPathSum = function (root, sum) { // 遍历到叶子节点下一个节点-终止递归 if (root === null) return false // 遍历到叶子节点 判断剩余节点是否与和差值为0 if (root.left === null && root.right === null) { return sum - root.val === 0 } // sum一次减去该节点左节点、右节点 是否等于最后叶子节点 let left = hasPathSum(root.left, sum - root.val), right = hasPathSum(root.right, sum - root.val) // 存在一侧满足就满足 return left || right }
代码实现
注意
stack 与 sumStack 的数据是一一对应的,遍历中会遍历所有节点及根节点到任意节点的差值
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @param {number} sum * @return {boolean} */ var hasPathSum = function (root, sum) { if (!root) return false let stack = [root], sumStack = [sum - root.val] while (stack.length) { let node = stack.pop(), curSum = sumStack.pop() if (curSum === 0 && !node.left && !node.right) { return true } if (node.left) { stack.push(node.left) sumStack.push(curSum - node.left.val) } if (node.right) { stack.push(node.right) sumStack.push(curSum - node.right.val) } } return false }
本文分享自微信公众号 - 前端小书童(gaowenju_web),作者:坑人的小书童
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-07-07
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句