【BFS】——LeetCode - 112. 路径总和
发布日期:2021-05-07 21:20:21 浏览次数:30 分类:精选文章

本文共 1633 字,大约阅读时间需要 5 分钟。

为了解决问题,我们可以采用广度优先搜索(BFS)的方法来判断是否存在一条从根节点到叶子节点的路径,使得路径上的节点值之和等于目标和targetSum。

解题思路

我们使用两个队列来实现BFS:一个队列存储需要遍历的节点,另一个队列存储到达这些节点时的路径和。这样可以确保每个节点只被处理一次,避免重复计算。

具体步骤如下:

  • 初始化队列,将根节点加入队列,并记录初始路径和。
  • 在循环处理中,取出队列中的当前节点,检查其是否是叶子节点。如果是,检查路径和是否等于目标和。
  • 如果不是叶子节点,继续处理左孩子和右孩子,将它们加入队列,并更新路径和。
  • 在处理过程中,提前终止:如果当前路径和已经超过目标和,跳过处理左孩子和右孩子。
  • 这种方法的时间复杂度为O(n),其中n是二叉树的节点数。每个节点只会被访问一次。

    代码实现

    import java.util.*;
    class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
    if (root == null) {
    return false;
    }
    Queue
    queue = new LinkedList<>();
    Queue
    pathSum = new LinkedList<>();
    queue.offer(root);
    pathSum.offer(root.val);
    while (!queue.isEmpty()) {
    TreeNode current = queue.poll();
    int temp = pathSum.poll();
    if (temp > targetSum) {
    continue;
    }
    if (current.left == null && current.right == null) {
    if (temp == targetSum) {
    return true;
    }
    continue;
    }
    if (current.left != null) {
    queue.offer(current.left);
    pathSum.offer(temp + current.left.val);
    }
    if (current.right != null) {
    queue.offer(current.right);
    pathSum.offer(temp + current.right.val);
    }
    }
    return false;
    }
    }

    代码解释

  • 初始化队列:使用两个队列queuepathSum分别存储节点和路径和。
  • 处理节点:循环处理队列中的节点,取出当前节点并检查路径和。
  • 叶子节点检查:如果当前节点是叶子节点,检查路径和是否等于目标和。
  • 处理子节点:将左孩子和右孩子加入队列,并更新路径和。
  • 提前终止:如果路径和超过目标和,跳过处理子节点。
  • 这种方法确保了每个节点只被处理一次,并且在路径和超过目标和时提前终止,提高了算法的效率。

    上一篇:【BFS】——LeetCode - 752. 打开转盘锁
    下一篇:【BFS】——LeetCode - 111.二叉树的最小深度

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月12日 17时47分03秒