剑指offer----二叉树中和为某一值的路径

题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/

分析题目:

  • 某个路径上的节点的和为输入的数。
  • 看到了路径,想到了深度优先遍历,这一定是一道深度优先遍历的题。
  • 既然是深度优先遍历,那应该使用栈或者递归。

那么就会产生下面几个问题:

  • 如何存储路径上的和的值
  • 如果使用递归,终止条件的选择
  • 如果发现一个路径与符合题意,如果将其放入ArrayList中
  • 多个符合条件的路径公用一些节点
public class Solution {
    private ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();//存储结果
    private ArrayList<Integer> array = new ArrayList<>();//用于存储当前调用栈的节点,递归结束节点自动删去。
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        if(root == null){
            return arrayLists;//结束
        }
        array.add(root.val);//将本节点的值加入array中
        target -= root.val; //target减去该路径中每层节点的值
        if(target == 0 && root.left == null && root.right == null){//符合题意的条件
            arrayLists.add(new ArrayList<>(array));//将该路径加入到结果中
        }
        FindPath(root.left, target);//左子节点递归
        FindPath(root.right, target);//右子节点递归
        array.remove(array.size() - 1);//从array中移除本层节点,保证array中的永远保存的是执行体所在的节点以上的路径。保证数据清洁,
        return arrayLists;//返回值仅用于最后的返回条件,无时间逻辑意义
    }
}

可以说,这是我刷题以来见过的最棒的一个代码了,从这里面学了很多知识

  • 无用的数据及时删除,可以保证整个数据的整洁。
  • 当需要记录很多个array时,可以通过构造参数复制公共array,之后公共array仍可以安全的更新
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构和算法--二叉树的实现 几种二叉树 1、二叉树 和普通的树相比,二叉树有如下特点: 每个结点最多只有两棵子...
    sunhaiyu阅读 6,582评论 0 14
  • 四、树与二叉树 1. 二叉树的顺序存储结构 二叉树的顺序存储就是用数组存储二叉树。二叉树的每个结点在顺序存储中都有...
    MinoyJet阅读 1,636评论 0 7
  • 【不忘初心】20171116学习力践行day37:1.识字:继续古诗叫醒《敕勒歌》、《游子吟》,昨晚算是第一次画日...
    Tiffanyzj阅读 165评论 0 0
  • 阿香:教练,我老公现在没工作,总是依赖我,经常找我拿钱,我挺烦的, 教练:烦什么? 阿香:他干嘛自己不长进,自己去...
    疗愈师李玉阅读 320评论 0 0