Leetcode - 路径总和

系列题目

第1类

  1. Leetcode-112路径总和

    该树中是否存在根节点到叶子节点的路径,返回true/false即可

  2. Leetcode-113路径总和 II

    113在112的基础上, 需要保存住符合条件的路径

    关注点: 【如何保存】,js是深拷贝

  3. Leetcode-437路径总和 III

    不限制路径是从根开始,叶子结束

第2类

  1. Leetcode-257二叉树的所有路径

    相当于遍历所有的路径,并保存, 深搜递归

112. 路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

关键: 就是递归的处理

function(root, sum) {
 if(!root){
 return false
 }
 sum = sum - root.val
 if(!root.left && !root.right){
 return sum === 0
 }
 return hasPathSum(root.left, sum) || hasPathSum(root.right, sum)
};

113. 路径总和 II

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

关键:path = [...path, root.val] 深拷贝保存路径

var pathSum = function(root, sum) {
 let res = []
 function backtrack (root, sum, path) {
 if(!root) {
 return
 }
 path = [...path, root.val]   // 深拷贝, 比112多了储存
 sum = sum - root.val
 if(!root.left & !root.right) {
 if (sum === 0) {
 res.push(path)
 } else {
 return false
 }
 }
 backtrack(root.left, sum, path)
 backtrack(root.right, sum, path)
 }
​
 backtrack(root, sum, [])
 return res
};

437. 路径总和 III

给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

关键

首先需要一个辅助函数,代表以当前节点为根的路径和条数
然后递归计算以每个节点为根的 总和

var pathSum = function(root, sum) {
 if(!root){return 0}
 // 递归每个节点调用help这个函数
 return help(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum)
};
​
// 从这个根节点开始, 路径和等于sum的 路径数目
function help (root, sum){
 let res = 0
 if (!root){
 return 0
 }
 if (root.val === sum){
 res += 1
 }
 return res + help(root.left, sum-root.val) + help(root.right, sum-root.val)
}

257. 二叉树的所有路径

回溯法

var binaryTreePaths = function(root) {
 let res = []
 function backtrack (root, str){
 if(!root){
 return ''
 }
 str += root.val + '->'
 if(!root.left && !root.right){
 res.push(str.replace(/->$/g,''))
 }
 backtrack(root.left, str)
 backtrack(root.right, str)
​
 }
 backtrack(root, '')
 return res
};

你可能感兴趣的:(Leetcode - 路径总和)