【AcWing 47.】二叉树中和为某一值的路径Java实现

题目:

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
保证树中结点值均不小于 0<p>
数据范围
树中结点的数量 [0,1000]。
给出二叉树如下所示,并给出num=225
     / \
    4   6
   /   / \
  12  13  6
 /  \    / \
9    1  5   1
<p>
输出:[[5,4,12,1],[5,6,6,5]]
package algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author liuxz
 * 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
 * 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
 * 保证树中结点值均不小于 0。
 * <p>
 * 数据范围
 * 树中结点的数量 [0,1000]。
 * 给出二叉树如下所示,并给出num=22。
 *       5
 *      / \
 *     4   6
 *    /   / \
 *   12  13  6
 *  /  \    / \
 * 9    1  5   1
 * <p>
 * 输出:[[5,4,12,1],[5,6,6,5]]
 */
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) {
        val = x;
    }
}

public class Solution {
    private static List<List<Integer>> ans = new ArrayList<>();
    private static List<Integer> path = new ArrayList<>();

    public static List<List<Integer>> findPath(TreeNode root, int sum) {
        dfs(root, sum);
        for (List<Integer> an : ans) {
            System.out.println(an);
        }
        return ans;
    }

    public static void dfs(TreeNode root, int sum) {
        if (root == null) {
            // 空树
            return;
        }
        // 当前遍历结点
        path.add(root.val);
        // 将sum减去当前结点值
        sum -= root.val;
        if (root.left == null && root.right == null && sum == 0) {
            // 进入循环内部说明:遍历到叶子结点,且满足路径之和等于sum
            // 引用调用,需要复制path内容,不然存在ans中的为引用
            List<Integer> tmp = new ArrayList<>();
            tmp.addAll(path);
            ans.add(tmp);

        }
        // 递归遍历左子树
        dfs(root.left, sum);
        // 递归遍历右子树
        dfs(root.right, sum);
        // 遍历过的叶子结点,将其删除,后继续遍历下一叶子结点
        path.remove(path.size() - 1);
    }
    public static void main(String[] args) {
        TreeNode node41 = new TreeNode(9);
        TreeNode node42 = new TreeNode(1);
        TreeNode node43 = new TreeNode(5);
        TreeNode node44 = new TreeNode(1);

        TreeNode node31 = new TreeNode(12);
        node31.left = node41;
        node31.right = node42;
        TreeNode node32 = new TreeNode(13);
        TreeNode node33 = new TreeNode(6);
        node33.left = node43;
        node33.right = node44;

        TreeNode node21 = new TreeNode(4);
        node21.left = node31;
        TreeNode node22 = new TreeNode(6);
        node22.left = node32;
        node22.right = node33;
        TreeNode node11 = new TreeNode(5);
        node11.left = node21;
        node11.right = node22;

        findPath(node11, 22);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值