作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
阶段4、深入jdk其余源码解析
阶段5、深入jvm源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】
码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
此代码挪用牛客上的推荐答案
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>> paths=new ArrayList<ArrayList<Integer>>();if(root==null)return paths;find(paths,new ArrayList<Integer>(),root,target);return paths;}public void find(ArrayList<ArrayList<Integer>> paths,ArrayList<Integer> path,TreeNode root,int target){path.add(root.val);if(root.left==null&&root.right==null){if(target==root.val){paths.add(path);}return;}ArrayList<Integer> path2=new ArrayList<>();path2.addAll(path);if(root.left!=null)find(paths,path,root.left,target-root.val);if(root.right!=null)find(paths,path2,root.right,target-root.val);}}
讲解一下解题思路:
假设有如下二叉树:
输入整数target为: 9
进入到find()方法中,首先第一步就将根结点的值加进来, 第一个if语句肯定是过不了的,然后到下面
new了一个path2(对于为什么要new一个path2,是因为当你path左孩子这条路径的时候,如果那条路径不能用了,递归回来之后,你在判断右孩子的时候,你继续用path这个你觉得里面的值还是你当前这个节点的list吗,它里面已经加入了它后面的值了,所有相当于在当前结点保存一份用于判断当前结点右孩子的时候用的list);
第一个if对其跟结点的左孩子群进行判断,进来之后把4当成跟结点,而且现在的target整数,应该是target-root.val;然后继续,进来之后又是进行if语句的判断,发现值还是不满足第一个if(说明还没有到叶子结点),进行深入到结点5,发现已经到了叶子结点也就是满足了第一个if的判断进入发现,值并不满足target==root.val,那就不是我们要找的路径,不加入到paths中,然后递归回来,递归根结点4的右孩子,结点3是叶子结点,进入if语判断发现target=root.val;(这里解释一下,target经历了什么:第一个target=9,第一次target=9-2=7,第二次target=7-4=3);所以发现该路径是我们所要的路径,加入到paths;
后面的递归是一样的,你们可以按照各个的思路递归继续判断,问题基本上完美解决.
总结一下:为什么我现在没自己去敲代码了,因为时间紧迫,被逼的!赶时间,所以没办法.