代码随想录 112.路径总和
一、递归函数什么时候需要返回值?什么时候不需要返回值?
1.如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。
2.如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。
3.如果需要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回(本题的情况)。
方法一:深搜递归(本题前中后序都可以,因为中节点没有处理逻辑)
1.确定递归函数的参数和返回值类型。
(1)参数:二叉树的根节点和一个计数器(计算二叉树的一条边之和是否正好是目标和,int类型)。
(2)返回值类型:因为要找一条符合条件的路径,因此需要返回值。返回值类型为bool类型。
boolean hasPathSum(TreeNode root, int targetSum)
2.确定终止条件:如果累加然后判断结果是否等于目标和,代码会比较麻烦;可以采用递减的逻辑,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。
(1)如果count == 0,且到了叶子节点,说明找到了目标和;
(2)如果遍历到了叶子节点,count不为0,说明没找到。
if (root.left == null && root.right == null) {return targetSum == 0;}
3.确定单层递归的逻辑:求每条路径的总和,需要后撤重新找一条路径,因此需要回溯。
targetSum -= root.val;if (root.left != null) {boolean left = hasPathSum(root.left, targetSum);if (left) { // 已经找到,提前返回return true;}}if (root.right != null) {boolean right = hasPathSum(root.right, targetSum);if (right) { // 已经找到,提前返回return true;}}return false;
附代码:
class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {if(root == null){return false;}targetSum -= root.val;if(root.left == null && root.right == null){return targetSum == 0;}if(root.left != null){boolean left = hasPathSum(root.left,targetSum);if(left){ //已经找到,提前返回return true;}}if(root.right != null){boolean right = hasPathSum(root.right,targetSum);if(right){ //已经找到,提前返回return true;}}return false;}
}
方法二:用栈模拟递归迭代。将节点压入栈时,需要把该节点以及该节点的路径数值都记录下来。