题目描述

输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

示例1
输入
{10,5,12,4,7},22
返回值
[[10,5,7],[10,12]]

示例2
输入
{10,5,12,4,7},15
返回值
[]

题解

递归型深度优先遍历:看子树的和+根节点是否等于target。

import java.util.ArrayList;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();

        // 节点为空,返回空集
        if(root==null){
            return res;
        }

        // 叶子节点的值=剩余目标值,加入列表中
        if(root.val==target&&root.left==null&&root.right==null){
            ArrayList<Integer>list=new ArrayList<>();
            list.add(root.val);
            res.add(list);
            return res;
        }

        // 向左遍历
        ArrayList<ArrayList<Integer>>temp=combine(root.val,FindPath(root.left,target-root.val));
        if(temp!=null){
            res.addAll(temp);
        }
        // 向右遍历
        temp=combine(root.val,FindPath(root.right,target-root.val));
        if(temp!=null){
            res.addAll(temp);
        }
        return res;
    }
    // 将子树满足条件的序列添加到尾部
    private ArrayList<ArrayList<Integer>> combine(Integer head,ArrayList<ArrayList<Integer>>list){
    // 如果子树返回的结果为空集,说明当前节点所在的路径都不满足条件
        if(list.size()==0){
            return null;
        }
        ArrayList<ArrayList<Integer>>res=new ArrayList<>();
        for(ArrayList<Integer> temp:list){
            ArrayList<Integer>tt=new ArrayList<>();
            tt.add(head);
            tt.addAll(temp);
            res.add(tt);
        }
        return res;
    }
}