剑指Offer:JZ24 - 二叉树中和为某一值的路径(解题思路+java代码)

JZ24 - 二叉树中和为某一值的路径

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

解题思路:从根节点到叶子节点的路径上的值之和等于输入的整数,找出符合这样的路径。也就是从根节点开始,相当于深度优先遍历,逐个走完每个路径,将正确的结果保存。

/**
 * @author 枫叶火火
 */
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 {
    //保存最后结果
    private ArrayList<ArrayList<Integer>> resultList;
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
        resultList = new ArrayList<>();
        //从根节点开始遍历,保存到新创建的集合中
        findPath(root, target, new ArrayList<>());
        return resultList;
    }
    //深度优先遍历,寻找合适路径的集合,保存到resultList集合中
    public void findPath(TreeNode node, int target, ArrayList<Integer> list){
        if(node == null)
            return;
        //将节点的中的值添加到list中
        list.add(node.val);
        //更新当前值
        target -= node.val;
        //如果当前值正好为0,并且当前节点为叶子节点
        if(target == 0 && node.left == null && node.right == null)
            //将得到的集合添加到resultList中
            resultList.add(new ArrayList<>(list));
        else {
            //不符合上述条件
            //继续操作左子树
            findPath(node.left, target, list);
            //继续操作右子树
            findPath(node.right, target, list);
        }
        //回退的时候删除当前添加的节点
        list.remove(list.size() - 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值