二叉树是否存在节点和为指定值的路径/路径总和Ⅱ
题目:给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum 的路径,
例如:
给出如下的二叉树,sum=22

返回true,因为存在一条路径5→4→11→2的节点值之和为 22
思路:回溯算法是深度优先搜索的一种
代码:
1 /* 2 * function TreeNode(x) { 3 * this.val = x; 4 * this.left = null; 5 * this.right = null; 6 * } 7 */ 8 9 /** 10 * 11 * @param root TreeNode类 12 * @param sum int整型 13 * @return bool布尔型 14 */ 15 function hasPathSum( root , sum ) { 16 // write code here 17 function dfs(root, sum){ 18 if(!root) return false; 19 if(!root.left && !root.right){ 20 return root.val === sum; 21 } 22 return dfs(root.left, sum - root.val) || dfs(root.right, sum - root.val); 23 } 24 return dfs(root, sum) 25 } 26 module.exports = { 27 hasPathSum : hasPathSum 28 };
1 /** 2 * Definition for a binary tree node. 3 * function TreeNode(val, left, right) { 4 * this.val = (val===undefined ? 0 : val) 5 * this.left = (left===undefined ? null : left) 6 * this.right = (right===undefined ? null : right) 7 * } 8 */ 9 10 /** 11 * @param {TreeNode} root 12 * @param {number} targetSum 13 * @return {number[][]} 14 */ 15 const pathSumSolu = (node, target, stack, sum, res) => { 16 // 将节点入栈 17 stack.push(node.val); 18 // 节点加入到sum中 19 sum += node.val; 20 // 到达了叶子节点,并且当前记录的sum正好满足条件 21 if (!node.left && !node.right && sum === target) { 22 // 将栈中的节点推入返回结构res中 23 res.push(stack.slice(0)); 24 } 25 // 如果存在左节点,继续遍历左子树 26 if (node.left) { 27 pathSumSolu(node.left, target, stack, sum, res); 28 } 29 // 如果存在右节点,继续遍历右子树 30 if (node.right) { 31 pathSumSolu(node.right, target, stack, sum, res); 32 } 33 // 如果不存在左右节点,表明已到达叶子节点,向上回溯。stack弹出一个节点 34 stack.pop(); 35 }; 36 var pathSum = function(root, targetSum) { 37 const res = []; 38 if (root) { 39 pathSumSolu(root, targetSum, [], 0, res); 40 } 41 return res; 42 };

浙公网安备 33010602011771号