1,找到所有到达叶子节点的路径,用path数组记录路径
例题:力扣257. 二叉树的所有路径(JavaScript)_前端-pww的博客-CSDN博客
257. 二叉树的所有路径 :给定一个二叉树,返回所有从根节点到叶子节点的路径。
说明: 叶子节点是指没有子节点的节点。
分析题目:遍历所有路径,不需要处理返回值,
是叶子节点:把当前值加入路径( p+=root.val),并把路径加入结果
不是叶子节点:当前值加入路径(p+=root.val+'->'),递归左右子节点
var binaryTreePaths = function(root) {
let arr=[]
const dd=function(root,p){
//叶子节点
if(root.left==null&&root.right==null){
p+=root.val
arr.push(p)
return
}
//非叶子节点
p+=root.val+'->'
root.left&&dd(root.left,p)
root.right&&dd(root.right,p)
}
dd(root,'')
return arr
};
2,找到一个和为sum的到达叶子节点的路径
例题:力扣112. 路径总和(JavaScript)_前端-pww的博客-CSDN博客
112,路径总和 :给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
分析题目:找到一个和等于目标和的路径就返回true
(有返回值,就需要接收其递归过程中子节点产生的返回值)
- 当前为叶子节点,有两种情况,和为sum,(返回true),和不等于sum(返回false)
- 当前不是叶子节点,处理子节点,递归处理子节点(两个子节点有一个为true,那么结果就是true)
var hasPathSum = function(root, targetSum) {
if(root==null){
return false
}
const dd=function(root,sum){
sum+=root.val
//叶子节点
if(root.left==null&&root.right==null){
if(sum==targetSum){
return true
}else{
false
}
}
//非叶子节点
if(root.left&&dd(root.left,sum)||root.right&&dd(root.right,sum)){
return true
}
return false
}
return dd(root,0)
};
3,找到所有和为sum的到达叶子节点的路径
例题:力扣113. 路径总和 II(JavaScript)_前端-pww的博客-CSDN博客
113. 路径总和ii :给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
分析题目:遍历整棵树,不需要返回值,把符合条件的路径加入结果数组,与上一题的区别在于需要记录路径,单独处理左右节点的回溯
var pathSum = function(root, targetSum) {
let arr=[]
if(root==null){
return arr
}
const dd=function(root,sum,p){
sum+=root.val
//叶子节点
if(root.left==null&&root.right==null){
if(sum==targetSum){
arr.push([...p])
return
}else{
return
}
}
//非叶子节点,有路径,需要单独回溯
if(root.left){
p.push(root.left.val)
dd(root.left,sum,p)
p.pop()
}
if(root.right){
p.push(root.right.val)
dd(root.right,sum,p)
p.pop()
}
}
dd(root,0,[root.val])
return arr
};
小疑问:
为什么sun不需要回溯但是path需要回溯呢?
传入数组,通过push操作,会改变原数组,所以需要回溯,但是sum是基本数据,当作参数传入函数,不会影响原来的值