在处理二叉树问题时,很多题目都采用了递归的方法。
首先聊一下返回值问题,递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:
- 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。
- 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (
- 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
思路分析:
本题主要还是考察二叉树的遍历,这里我们采用递归的方法实现深度优先遍历。
递归函数参数:需要二叉树的根节点,还需要一个计数器count来计算二叉树的一条边之和是否正好是目标和
返回值:可以发现这个题目并不需要处理递归返回值,因此递归函数不需要返回值
累加路径之和再进行判断比较麻烦,因此我们这里可以通过递减,每次减去遍历路径节点上的数值;
如果count为0,且为叶子节点,则说明找到了符合的路径;
而如果count为0,但不是叶子节点,则说明该条路径不符合;
如果左子树不为空, 则继续遍历左子树
如果右子树不为空,则继续遍历右子树
如果左右子树都找不出符合的路径,则进行回溯
代码实现
var pathSum = function(root, targetSum) {
//respath存放最终结果,curpath存放当前路径
let respath = [], curpath = [];
if(!root) return respath;
//递归函数
function dfs(node, count){
curpath.push(node.val);
count -= node.val;
if(count ===0 && !node.left && !node.right){
//说明符合要求
respath.push([...curpath]);
}
node.left&&dfs(node.left, count);
node.right&& dfs(node.right, count);
//回溯
let cur = curpath.pop();
count -= cur;
}
dfs(root,targetSum);
return respath;
};