import java.util.ArrayList; class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } /** * 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。 * 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 * <p> * 思路 * 1、遍历二叉树所有路径 * 用临时arraylist保存路径的所有数 * 当路径大于整数时取消该路径的遍历 * 当路径到达叶子节点且等于整数才说明是正确的路径 */ public class Solution24 { public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>(); ArrayList<Integer> arrayList = new ArrayList<>(); if (root == null) { return arrayLists; } findPath(arrayLists, arrayList, root, target, 0); return arrayLists; } private void findPath(ArrayList<ArrayList<Integer>> arrayLists, ArrayList<Integer> arrayList, TreeNode root, int target, int sum) { /** * 1、处理非法条件 */ if (sum > target || root == null) { return; } /** * 2、处理结果 */ sum += root.val; arrayList.add(root.val); if (sum == target && root.right == null && root.left == null) { // 需要new一个新的,否则添加的只是arrayList地址 arrayLists.add(new ArrayList<>(arrayList)); arrayList.remove(arrayList.size() - 1); return; } /** * 3、遍历所有可能出现的情况并进行下一步的尝试 */ findPath(arrayLists, arrayList, root.left, target, sum); findPath(arrayLists, arrayList, root.right, target, sum); /** * 4、回溯,取消前一步进行的尝试 */ arrayList.remove(arrayList.size() - 1); } }
回溯算法
所有结果中找到符合的结果,期间可回溯.
解题步骤
1、判断当情情况是否非法,如果非法就立即返回
2、当前情况是否已经满足递归结束条件,如果是就将当前结果保存起来并返回
3、当前情况下,遍历所有可能出现的情况并进行下一步的尝试
4、递归完毕后,立即回溯,回溯的方法就是取消前一步进行的尝试
代码模版
Function fn(n){ //第一步:判断输入或者状态是否非法 If(input/state is invalid){ Return; } //第二步,判断递归是否应当结束 If(match condition){ Return some value; } //遍历所有可能出现的情况 For(all possible cases){ //3、尝试下一步的可能性 Solution.push(case) //递归 Result = fn(m) //4、回溯到上一步 Solution.pop(case) } }