二叉树是否存在节点和为指定值的路径/路径总和Ⅱ

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

 

 返回true,因为存在一条路径54112的节点值之和为 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 };

 

posted @ 2021-05-23 09:50  icyyyy  阅读(153)  评论(0)    收藏  举报