本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
题目解析
思路一
我们首先要在
deep()左右节点调用时,如果都为空我们就要做出对应的处理,这里容易调用两次,调用两次的情况下就是会出现两次结果,所以我们这里判断了下p.left && p.right,如果父节点已经满足,且仅有左节点或者右接点,是为正确的。我们在判断下!p.left&&!p.right追加了flag标识是否为叶子节点,还需要判断root是否为空,然后再进行处理,最后进行返回
/**
* @param {TreeNode} root
* @param {number} sum
* @return {number[][]}
*/
var pathSum = function(root, sum) {
let result = []
function deep(p,arr,num,flag){
if(!p &&num === sum && flag){
result.push(arr)
return
}
if(!p){
return
}
if(!p.left && !p.right){
deep(p.left,[...arr,p.val],num+p.val,true)
}else{
deep(p.left,[...arr,p.val],num+p.val,false)
deep(p.right, [...arr,p.val],num+p.val,false)
}
}
if(root){
deep(root,[],0)
}
return result
};
思路二
我们这里使用递归的方式进行实现,首先定义一个接收结果的数组,然后再定义一个递归函数,递归函数中对数组的左右节点进行判断,然后使用递归函数进行调用左节点和右节点,然后左节点调用的函数和右节点调用的函数都返回结果,最后使用
arr.pop()去除该叶子节点
/**
* @param {TreeNode} root
* @param {number} sum
* @return {number[][]}
*/
var pathSum = function(root, sum) {
let res = [];
help(root, sum, res, []);
return res;
};
function help(root, sum, res, arr) {
if (root === null) return;
arr.push(root.val);
if (root.left === null && root.right === null && root.val === sum) {
res.push([...arr]);
}
help(root.left, sum-root.val, res, arr);
help(root.right, sum-root.val, res, arr);
arr.pop();
}