题目描述:
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
路径定义为从树的根结点 开始往下一直到叶结点所经过的结点形成一条路径。
例如:我们输入的整数为7,就有以下4种路径。
思路:
首先我们看到回溯法的题:首先脑子里要能想到 深度优先遍历,结果集,待选结果!!!
回溯的本质:穷举的过程,在穷举的过程中要进行剪枝。
回溯过程:
1.先添加根结点
2.更新目标值
3.判断是否满足条件
4.DFS
5.回退
代码实现:
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 expectNumber) {
//创建一个结果集
ArrayList<ArrayList<Integer>> result = new ArrayList<> ();
//创建待选结果
ArrayList<Integer> list = new ArrayList<>();
//调用回溯函数
FindPathDFS(root,expectNumber,result,list);
//返回结果集 里面保存了所有符合条件的路径
return result;
}
public void FindPathDFS(TreeNode root,int expectNumber,ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list){
if(root == null){
return;
}
//1.先把根结点添加进去
list.add(root.val);
//2.更新expectNumber
expectNumber = expectNumber-root.val;
//判断是否满足条件
if(root.left == null && root.right == null && expectNumber == 0){
result.add( new ArrayList<Integer>(list));
}
FindPathDFS(root.left,expectNumber,result,list);
FindPathDFS(root.right,expectNumber,result,list);
list.remove(list.size()-1);
}
}