仓库源文站点原文


title: '算法:二叉树中和为某一值的路径' cover: https://img.paulzzh.com/touhou/random?33 categories: 算法题目 date: 1996-07-27 08:00:00 tags: [算法题目, 二叉树, 回溯]

toc: true

<br/>

<!--more-->

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

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

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

(注意: 在返回值的list中,数组长度大的数组靠前)


分析

典型的回溯法, 使用DFS向下搜索的时候, 如果是叶子节点, 则判断是否和为target. 如果和是sum则加入答案;

每一步结束则对当前节点进行回溯返回


代码

import java.util.ArrayList;

public class Solution {
    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>(128);
        if (root == null) return res;
        helper(root, target, res, new ArrayList<>(256), 0);
        return res;
    }

    private void helper(TreeNode root, int target, ArrayList<ArrayList<Integer>> res, ArrayList<Integer> cur, int sum) {
        if (root == null) return;

        sum += root.val;
        // 为叶子节点
        if (root.left == null && root.right == null) {
            if (sum == target) {
                cur.add(root.val);
                res.add(new ArrayList<>(cur));
                cur.remove(cur.size() - 1);
            }
            return;
        }

        // 回溯
        cur.add(root.val);
        helper(root.left, target, res, cur, sum);
        helper(root.right, target, res, cur, sum);
        cur.remove(cur.size() - 1);
    }
}