剑指offer(牛客)---24.二叉树中和为某一值的路径

题目描述

输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的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;

后面的递归是一样的,你们可以按照各个的思路递归继续判断,问题基本上完美解决.

总结一下:为什么我现在没自己去敲代码了,因为时间紧迫,被逼的!赶时间,所以没办法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值