25PathInTree二叉树中和为某一值的路径

本文介绍了一种算法,用于寻找二叉树中所有节点值之和等于特定目标值的路径。通过递归前序遍历的方法,结合使用ArrayList来记录路径上的节点值,最终收集并返回所有符合条件的路径。

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

import common.TreeNodeCommon;

import java.util.ArrayList;

/**
 * 基本思路前序遍历外加数组来保存路径
 *
 * 关于把一个arraylist赋值给另外一个arraylist
 * ArrayList<Integer> arrayList1 = new ArrayList<>(arrayList);
 * @author LemonLin
 * @Description :PathInTree25
 * @date 2018/3/22-20:10
 */
public class PathInTree25 {

    public ArrayList<ArrayList<Integer>> FindPath(TreeNodeCommon root, int target) {

        if (root == null){
            return new ArrayList<ArrayList<Integer>>();
        }
        int currentSum = 0;
        //用来存储符合要求的所有的路径的数列
        ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<ArrayList<Integer>>();
        //用来存储每一次得到的符合要求的路径和的数列
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        FindPath(root,target,currentSum,arrayList,arrayLists);
        return arrayLists;
    }

    void FindPath(TreeNodeCommon root, int target,int currentSum,
                                           ArrayList arrayList,ArrayList<ArrayList<Integer>> arrayLists){


        //是否到达了叶子结点,是,就打印出来
        currentSum +=root.data;
        arrayList.add(root.data);
        Boolean isLeaf = (root.left==null && root.right ==null);

        if (currentSum == target && isLeaf){

            //这里必须新建一个arrayList1来存储结果,否则因为传入的arrayList是指针,最后会使
            //双数组为空
            ArrayList<Integer> arrayList1 = new ArrayList<>(arrayList);

            arrayLists.add(arrayList1);
        }
        //否就遍历左右结点
        if (root.left != null){
            FindPath(root.left,target,currentSum,arrayList,arrayLists);
        }
        if (root.right != null){
            FindPath(root.right,target,currentSum,arrayList,arrayLists);
        }
        //返回父结点之前,在路径上删除当前结点
        arrayList.remove(arrayList.size()-1);
    }
    public static void main(String[] args) {

        TreeNodeCommon treeNodeCommon1 = new TreeNodeCommon(10);
        TreeNodeCommon treeNodeCommon2 = new TreeNodeCommon(5);
        TreeNodeCommon treeNodeCommon3 = new TreeNodeCommon(12);
        TreeNodeCommon treeNodeCommon4 = new TreeNodeCommon(4);
        TreeNodeCommon treeNodeCommon5 = new TreeNodeCommon(7);

        treeNodeCommon1.left = treeNodeCommon2;
        treeNodeCommon1.right = treeNodeCommon3;
        treeNodeCommon2.left = treeNodeCommon4;
        treeNodeCommon2.right = treeNodeCommon5;

        PathInTree25 pathInTree25 = new PathInTree25();
        ArrayList<ArrayList<Integer>> arrayLists = pathInTree25.FindPath(treeNodeCommon1, 22);
        System.out.println(arrayLists);


    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值