题目
给你二叉树的根节点 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(); }