Loading

Medium | LeetCode 113 | 剑指 Offer 34. 二叉树中和为某一值的路径 | 回溯

剑指 Offer 34. 二叉树中和为某一值的路径

难度中等120

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

示例:
给定如下二叉树,以及目标和 sum = 22

      5
     / \
    4   8
   /   / \
  11  13  4
 /  \    / \
7    2  5   1

返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

提示:

  1. 节点总数 <= 10000

解决思路

使用回溯算法, 递归子树时, 将其目标和减去当前节点, 即子树需要达到的目标。并且当当前节点计算完成回溯时, 需要将之前添加的当前的节点删除。

private List<List<Integer>> resList = new ArrayList<>();

public List<List<Integer>> pathSum(TreeNode root, int sum) {
    if(root == null) {
        return resList;
    }
    pathSum(root, sum, new ArrayList<Integer>());
    return resList;
}

private void pathSum(TreeNode root, int sum, List<Integer> res) {
    // 递归出口
    if (root == null) {
        return;
    }
    // 递归出口 递归到根节点
    if (root.left == null && root.right == null) {
        if (root.val == sum) {
            res.add(root.val);
            resList.add(new ArrayList<>(res));
            res.remove(res.size()-1);
        }
        return;
    }
    // 添加当前节点
    res.add(root.val);
    // 递归左子树
    pathSum(root.left, sum - root.val, res);
    // 递归右子树
    pathSum(root.right, sum - root.val, res);
    // 当前节点计算完成, 需要回溯, 从路径中删除当前节点
    res.remove(res.size()-1);
}
posted @ 2021-01-15 17:31  反身而诚、  阅读(54)  评论(0编辑  收藏  举报