2025年- H54-Lc162--437. 路径总和 III(递归[回溯]OR深搜)--Java版
1.题目描述
2.思路
方法一:
对每个节点作为起点,查找从它往下延伸的路径,是否有路径和等于 targetSum。
外层 pathSum() 是遍历每一个节点(作为路径起点);
内层 rootSum() 是从当前节点往下查路径和。
方法二:
求不同路径,用递归,当然递归里面包括前中后的遍历。我们采用前序遍历(根左右),从父节点到孩子节点。’
3.代码实现
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val = val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}
public class H437 {//1.外层 pathSum() 是遍历每一个节点(作为路径起点);public int pathSum(TreeNode root, long targetSum) {if(root==null){return 0;}//从当前 root 节点开始,找以它为起点的所有路径,有多少条路径和是 targetSum,并把结果保存到 cnt 中。int cnt= rootSum(root,targetSum);
// 分别递归地处理 左子树 和 右子树,把它们作为新的起点继续找路径。
//
// 这两行的作用是:
//
// 假设 root 是路径起点我们处理完了,
//
// 现在尝试以 root.left 和 root.right 作为起点再处理。cnt=cnt+pathSum(root.left,targetSum);cnt=cnt+pathSum(root.right,targetSum);//返回当前节点(作为起点)以及左右子树中所有满足路径和的路径数。return cnt;}//2.内层 rootSum() 是从当前节点往下查路径和。public int rootSum(TreeNode root,long targetSum)//找出“以当前 root 为路径起点”有多少条路径,路径和等于 targetSum{int cnt=0;// 递归终止条件:节点为空,直接返回 0。if (root == null) {return 0;}// 如果当前节点值等于 targetSum,说明已经找到了一条符合要求的路径,计数器 ret++。int val=root.val;if(val==targetSum){cnt++;}//递归遍历左右子树//把目标和减去当前节点值后继续往下找,// 即“从当前节点出发的一条路径”的后续路径是否能补足剩余的值。cnt+=rootSum(root.left,targetSum-val);cnt+=rootSum(root.right,targetSum-val);// 即“从当前节点出发的一条路径”的后续路径是否能补足剩余的值。return cnt;}public static void main(String[] args){H437 test=new H437();TreeNode root=new TreeNode(10);root.left=new TreeNode(5);root.right=new TreeNode(-3);root.left.left=new TreeNode(3);root.left.right=new TreeNode(2);root.right.right=new TreeNode(11);root.left.left.left = new TreeNode(3);root.left.left.right = new TreeNode(-2);root.left.right.right = new TreeNode(1);
// TreeNode root = new TreeNode(10);
// root.left = new TreeNode(5);
// root.right = new TreeNode(-3);
// root.left.left = new TreeNode(3);
// root.left.right = new TreeNode(2);
// root.right.right = new TreeNode(11);
// root.left.left.left = new TreeNode(3);
// root.left.left.right = new TreeNode(-2);
// root.left.right.right = new TreeNode(1);
//int targetSum = 8;int result = test.pathSum(root, targetSum);System.out.println("路径总和为 " + targetSum + " 的路径条数为:" + result);}
}