刷题的日常-二叉树中和为某一值的路径

62 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

刷题的日常-2023年2月10号

一天一题,保持脑子清爽

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

来自leetcode的 剑指 Offer 34 题,题意如下:

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出 一棵二叉树 和一个 目标值
  • 要求我们在树中寻找所有的路径,对路径的要求如下
    • 路径要从根节点开始,一直到叶子节点才结束
    • 路径上的值的总和要等于给定的目标值
  • 返回所有满足条件的路径

做题思路

要寻求路径,我们可以用深度优先遍历进行搜索。对于每一个节点,需要先判断是否是叶子节点,因为路径是要一直到叶子节点才结束的,这个是终结条件。其次需要判断当前叶子节点的路径上的和是否为对应的目标值,这个可以从上层的函数传进来。如果不是叶子节点,则递归调用即可,步骤如下:

  • 因为需要存储路径,所以需要一个栈进行存储,递归遍历的过程需要对栈进行操作
  • 另外需要一个保存结果集的集合
  • 递归调用,如果当前节点为空,直接返回
  • 如果不为空,将当前节点压入栈中进行记录
  • 如果是叶子节点,判断余下的和是否和当前值相等,相等则记录路径,然后返回
  • 如果不是叶子节点,则需要递归调用

注意

  • 递归完成之后不要忘记将当前节点移出栈

代码实现

代码实现如下:

public class Solution {
    LinkedList<Integer> stack = new LinkedList<>();
    List<List<Integer>> result = new LinkedList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return result;
        }
        stack.push(root.val);
        if (root.left == null && root.right == null && root.val == targetSum) {
            List<Integer> item = new ArrayList<>(stack.size());
            int index = stack.size() - 1;
            while (index >= 0) {
                item.add(stack.get(index--));
            }
            result.add(item);
            stack.pop();
            return result;
        }
        pathSum(root.left, targetSum - root.val);
        pathSum(root.right, targetSum - root.val);
        stack.pop();
        return result;
    }
}

image.png