系列题目
第1类
-
Leetcode-112路径总和
该树中是否存在根节点到叶子节点的路径,返回true/false即可
-
Leetcode-113路径总和 II
113在112的基础上, 需要保存住符合条件的路径
关注点: 【如何保存】,js是深拷贝
-
Leetcode-437路径总和 III
不限制路径是从根开始,叶子结束
第2类
-
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
};