Open songyy5517 opened 1 year ago
思路:回溯法,递归前序遍历 & 路径记录
复杂度分析
注意:
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 11:28-11:45
*
* @param root TreeNode类
* @param target int整型
* @return int整型ArrayList<ArrayList<>>
*/
ArrayList<ArrayList<Integer>> res = new ArrayList();
LinkedList<Integer> path = new LinkedList();
public ArrayList<ArrayList<Integer>> FindPath (TreeNode root, int target) {
// write code here
// 思路:二叉树DFS遍历。定义全局变量记录当前路径以及当前和。
DFS(root, target);
return res;
}
void DFS(TreeNode root, int target){
// 递归出口
if (root == null)
return ;
// 更新当前路径和当前路径和
path.add(root.val);
target -= root.val;
// target为0说明当前路径符合要求
if (target == 0 && root.left == null && root.right == null){
res.add(new ArrayList<Integer>(path));
}
DFS(root.left, target);
DFS(root.right, target);
// 回溯
path.removeLast();
return;
}
}
2023/1/28 2023/1/30 2024/1/29 2024/2/28
JZ84 二叉树中和为某一值的路径(三) 描述 给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求:
示例1
输入:{1,2,3,4,5,4,3,#,#,-1},6
返回值:3
说明:
如图所示,有3条路径符合
示例2
输入:{0,1},1
返回值:2
示例3
输入:{1,#,2,#,3},3
返回值:2
思路:DFS,嵌套递归
复杂度分析
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param root TreeNode类
* @param sum int整型
* @return int整型
*/
int num = 0;
public int FindPath (TreeNode root, int sum) {
// write code here
// 思路:DFS。需要注意的是路径的定义,可以不为根节点为首节点。
// 1. 异常处理
if (root == null)
return 0;
// 2. DFS
dfs(root, sum);
return num;
}
// 查找以root为根节点的合格路径数
void searchPath(TreeNode root, int sum){
// 递归出口
if (root == null)
return;
// 满足条件
if (sum == root.val)
num ++;
searchPath(root.left, sum - root.val);
searchPath(root.right, sum - root.val);
}
// 遍历树中的各个节点
void dfs(TreeNode root, int sum){
// 递归出口
if (root == null)
return ;
// 以当前节点为根,查找合格路径
searchPath(root, sum);
dfs(root.left, sum);
dfs(root.right, sum);
}
}
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
示例 2:
示例 3:
分析 这道题需要我们找到二叉树中的路径。一个很直接的想法是对二叉树进行先根遍历(DFS),再对所有路径进行验证,保存符合条件的路径。