vlambda博客
学习文章列表

24.二叉树中和为某一值的路径

题目描述

输入一颗二叉树的根节点和一个整数,找到所有树的路径,这一路径上的数的和为输入整数。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

树节点的定义

public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
        }
}

思路

遇到树的问题还是想到用递归,想清楚递归结束条件。


*/
// 这段代码写的相当简洁, 实在想不出来就多背下来,多背诵几次
// 还有就是手动模拟几次就ok了
public class Solution {
    //单个满足条件的路径
    ArrayList<Integer> list = new ArrayList<>();
    //找到所有满足条件的路径
    ArrayList<ArrayList<Integer>> path = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        if(root != null) {
            list.add(root.val);
            //当单个路径加入一个元素,则 target 的值就要减去相应的值。
            target -= root.val;
            boolean isLeaf = (root.left == null && root.right == null);
            //从根到叶子的路径上值加和等于target时,才能将给路径放到结果集中。
            if (target == 0 && isLeaf) {
                path.add(new ArrayList<>(list));
            } else {
                //不是叶子结点,遍历它的左右结点。
                FindPath(root.left, target);
                FindPath(root.right, target);
            }
            //回退的时候,需要删除单个路径中父结点。
            list.remove(list.size() - 1);

        }
        return path;
    }
}