// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
class Solution {
// res 存放所有满足要求的路径
LinkedList<List<Integer>> res = new LinkedList<>();
// path 为正在遍历的路径
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
// 前序遍历二叉树
// 此时路径上的和为 0
findPath(root, sum,0);
return res;
}
// curPathSum 表示 path 路径上的和
void findPath(TreeNode root, int tar,int curPathSum) {
// 访问到叶子节点的时候返回
if(root == null) return;
// 把当前节点添加到路径上
path.add(root.val);
//同时累加该节点的值
curPathSum += root.val;
// 1、当前节点为叶子节点
// 2、路径中所有节点的值之和等于输入的目标值
// 当前路径符合要求,把路径加入到结果数组中
if(tar == curPathSum && root.left == null && root.right == null){
// 需要创建一个新的对象 path 来拷贝全局的 path 再添加到 res 中,因为全局的 path 一直在变化
// 如果直接添加全局的 path,会导致结果 res 中所有的 path 都是一样的
res.add(new LinkedList(path));
}
// 继续访问它的左子节点
findPath(root.left, tar,curPathSum);
// 继续访问它的右子节点
findPath(root.right, tar,curPathSum);
// 访问完当前节点 需要删除路径中最后一个节点,回退至父节点
path.removeLast();
}
}
剑指 Offer 34. 二叉树中和为某一值的路径
最新推荐文章于 2024-09-27 00:45:01 发布