一、题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
二、思路分析及代码实现
方法一:递归法
思路分析:
1、若当前结点为空,则终止查找
2、若target==0,且此时当前结点无子结点,则找到一条路径;
3、若target<0,则表示该路径不满足 题目要求
4、若target>0,则对当前结点的子结点递归调用当前方法寻找路径。
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>> list =new ArrayList<ArrayList<Integer>>();
if(root==null){
return list;
}
ArrayList<Integer> list1=new ArrayList<>();
this.Find(root,target,list1,list);
return list;
}
public void Find(TreeNode root,int target,ArrayList<Integer> list1,ArrayList<ArrayList<Integer>> list) {
if(root==null){
return;
}
list1.add(root.val);
target=target-root.val;
if(target==0&&root.left==null&&root.right==null){
list.add(list1);
return ;
}
if(target<0){
return ;
}
this.Find(root.left,target,new ArrayList<>(list1),list);
this.Find(root.right,target,new ArrayList<>(list1),list);
}
}
做第二次时new ArrayList<>(list1)忘记导致链表的存储比较复杂
方法二:深度遍历回溯
该方法参考CSDN博主「AnApplePie」的原创文章,原文链接
思路分析
1、考虑题目求解的为从根结点到叶子结点的路径,所以考虑到可以用树的深度优先遍历来实现。
2、按照树的深度优先遍历思想分析我们的题目,当完成一条路径的遍历后,如果当前路径的结点值之和等于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 {
ArrayList<ArrayList<Integer>> list=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path=new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null){
return list;
}
path.add(root.val);
if(target==root.val&&root.left==null&&root.right==null){
list.add(new ArrayList<> (path));
}
if(root.left!=null&&target>root.val)
FindPath(root.left,target-root.val);
if(root.right!=null&&target>root.val)
FindPath(root.right,target-root.val);
path.remove(path.size()-1);
return list;
}
}
做第二次时list.add(new ArrayList<> (path))忘记导致链表的存储比较复杂