题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
示例1
输入
{10,5,12,4,7},22
返回值
[[10,5,7],[10,12]]
示例2
输入
{10,5,12,4,7},15
返回值
[]
解题思路-递归
1.如果当前节点的值大于目标值,则返回空链表
2.如果当前节点的值等于目标值,且当前节点为叶子节点,则返回此条结果(路径要求必须到叶节点)
3.如果当前节点值小于目标值,则更新目标值=目标值-当前节点的值
3.1递归当前节点的左子树,寻找新目标值
3.2递归当前节点的右子树,寻找新目标值
(最后要注意节点的判空,避免空指针)
Java代码
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>> ans=new ArrayList<>(); if(root == null){//为空,则返回空链表 return ans; } if(root.val >target){//根节点大于目标值,则代表没找到,返回空链表 return ans; } if(root.val==target){//根节点等于目标值 if(root.left == null && root.right == null){//根节点是叶节点 ArrayList<Integer> list=new ArrayList<>();//将根节点值存入数组list中,并添加到结果ans中返回 list.add(root.val); ans.add(list); return ans; } else{ return ans;//根节点不是叶节点,返回空链表 } } if(root.val<target){//根节点的值下于目标值 ArrayList<ArrayList<Integer>> left=FindPath(root.left,target-root.val);//递归左子树,目标值为原目标值减去根节点的值 ArrayList<ArrayList<Integer>> right=FindPath(root.right,target-root.val);//递归右子树,目标值为原目标值减去根节点的值 if( left != null){ for(int i=0;i<left.size();i++){//左子树存在结果值,可能有多组 ArrayList<Integer> tmp=new ArrayList<>(); tmp.add(root.val);//先加根节点,再加左子树的结果值,最后加到结果ans中 tmp.addAll(left.get(i)); ans.add(tmp); } } if(right != null){ for(int i=0;i<right.size();i++){//右子树存在结果值,可能有多组 ArrayList<Integer> tmp=new ArrayList<>(); tmp.add(root.val);//先加根节点,再加右子树的结果值,最后加到结果ans中 tmp.addAll(right.get(i)); ans.add(tmp); } } } return ans; } }