题目
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。
叶子节点是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
提示:
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
思路:深度优先搜索dfs+回溯法+前序遍历+路径记录+递归
pathSum(root, target) 函数:
初始化: 结果列表 res ,路径列表tmp。
返回值: 返回 res 即可。
dfs(root, target) 函数:
递推参数: 当前节点 root ,当前目标值 target 。
终止条件: 若节点 root 为空,则直接返回。
递推工作:
路径更新: 将当前节点值 root.val 加入路径 tmp ;
目标值更新: target = target - root.val(即目标值从target减至 0);
路径记录: 当root 为叶节点且路径和等于目标值 ,则将此路径 tmp 加入 res 。
先序遍历: 递归左 / 右子节点。
路径恢复: 向上回溯前,需要将当前节点从路径 tmp 中删除。
代码
/*** Definition for a binary tree node.* public 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;* }* }*/
class Solution {List> res;List tmp;public List> pathSum(TreeNode root, int target) {res = new ArrayList<>();tmp = new ArrayList<>();dfs(root, target);return res;}public void dfs(TreeNode root, int target) {if(root == null) {return;}tmp.add(root.val);target = target - root.val;if(root.left == null && root.right == null && target == 0) {res.add(new ArrayList<>(tmp));}dfs(root.left, target);dfs(root.right, target);tmp.remove(tmp.size() - 1);}
}
上一篇:rabbitmq+netcore6 【2】Work Queues:一个生产者两个消费者
下一篇:面向对象2(static修饰变量和方法、Javabean类、测试类和工具类、对main方法的理解、继承、子类继承父类构造方法变量和方法)