算法通关村-----透析回溯的模版

N叉树的遍历

回溯的模板代码与N叉树十分类似,首先我们先来看下N叉树的遍历过程

public class NTree {
    int val;
    List<NTree> children;

    public void travel(NTree root){
        if(root==null){
            return;
        }
        System.out.println(root.val);
        for(NTree child : root.children){
            travel(child);
        }
    }
}

回溯模版

N叉树的遍历一个递归的过程,其实,回溯本质上就是递归+局部枚举+放下前任。我们再来看下回溯的模版

void backTracking(参数){
    if(终止条件){
        存储结果;
        return;
    }
    //局部枚举
    for(选择本层集合中的元素){
        处理元素;
        //递归
        backTracking(参数);
        //放下前任
        回溯,撤销处理结果;
    }
}

二叉树的所有路径

问题描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。详见leetcode257

问题分析

我们直接使用回溯的模版解题

代码实现

public List<String> binaryTreePaths(TreeNode root) {
    List<String> resultList = new ArrayList<String>();
    List<Integer> pathList = new ArrayList<Integer>();
    backtracking(root,resultList,pathList);
    return resultList;
}

public void backtracking(TreeNode root, List<String> resultList,List<Integer> pathList){
    if(root==null){
        return;
    }
    pathList.add(root.val);
    if(root.left==null&&root.right==null){
        String result = getResult(pathList);
        resultList.add(result);
    }
    backtracking(root.left,resultList,pathList);
    backtracking(root.right,resultList,pathList);
    pathList.remove(pathList.get(pathList.size()-1));
}


public String getResult(List<Integer> pathList){
    StringBuilder sb = new StringBuilder();
    sb.append(pathList.get(0));
    for(int i=1;i<pathList.size();i++){
        sb.append("->"+pathList.get(i));
    }
    return sb.toString();
}

路径总和 II

问题描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。详见leetcode113

问题分析

我们直接使用回溯的模版解题

代码实现

public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
    List<List<Integer>> resultList = new ArrayList<>();
    Deque<Integer> pathList = new ArrayDeque<Integer>();
    backtracking(root,pathList,resultList,targetSum);
    return resultList;
}

public void backtracking(TreeNode root,Deque<Integer> pathList,List<List<Integer>> resultList,int targetSum){
    if(root==null){
        return;
    }
    pathList.addLast(root.val);
    targetSum-=root.val;
    if(root.left==null&&root.right==null&&targetSum==0){
        resultList.add(new ArrayList<>(pathList));
    }
    backtracking(root.left,pathList,resultList,targetSum);
    backtracking(root.right,pathList,resultList,targetSum);
    pathList.removeLast();
}

你可能感兴趣的:(算法)