二叉树中和为某一值路径
题目
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
思路
先序遍历:按照根节点、左子树、右子树的顺序遍历树的所有节点
路径记录:在先序遍历中,记录从根节点中到当前节点的路径。当路径中最后一个节点是叶子节点并且各个节点的和等于目标值,将此路径加入结果列表
- 将当前节点值root.val加入路径path中
- 更新目标值:tar = tar - root.val(直到tar变为0)
- 当tar = 0并且当前节点是叶子节点 记录路径,将path加入res中
- 然后先序遍历:递归左右节点
- 如果当前路径不对,向上进行回溯,将当前节点从路径中删除,执行pop操作。
代码
/**
* 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 {
LinkedList<List<Integer>> res = new LinkedList<>();// 存储所有的路径结果
LinkedList<Integer> path = new LinkedList<>();// 暂时得路径
public List<List<Integer>> pathSum(TreeNode root, int target) {
recur(root,target);
return res;
}
void recur(TreeNode root,int tar){
if(root == null) return;
// 先将根节点的值加入路径中
path.add(root.val);
tar -= root.val;// 减去一个节点值 直到0为止
if(tar == 0 && root.left == null && root.right == null)
{
res.add(new LinkedList(path)); // 如果tar=0 并且当前节点是叶子节点 那么 直接将路径加入res中
}
// 先序遍历
recur(root.left,tar);
recur(root.right,tar);
path.removeLast();// 向上回溯,直接删除 最后一个元素
}
}