leetcode 938.二叉搜索树的范围和
发布日期:2021-04-30 21:09:37 浏览次数:173 分类:精选文章

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

方法一:深度优先搜索思路

深度优先搜索是一种常用的方法来计算二叉搜索树的范围和。我们从树的根节点开始,逐层深入,直到叶子节点。以下是详细的思路分析:

  • 根节点为空:如果根节点为空,直接返回0,因为没有节点需要计算。

  • 根节点的值大于 high:由于二叉搜索树的右子树所有节点值均大于根节点,因此只需考虑左子树的范围和。

  • 根节点的值小于 low:同理,左子树所有节点值均小于根节点,因此只需考虑右子树的范围和。

  • 根节点的值在[low, high]范围内:这时,根节点的值需要加入总和,并递归地计算左子树和右子树的范围和。

  • 以下是对应的代码实现:

    public class Solution {
    public int rangeSumBST(TreeNode root, int low, int high) {
    if (root == null) {
    return 0;
    }
    if (root.val > high) {
    return rangeSumBST(root.left, low, high);
    }
    if (root.val < low) {
    return rangeSumBST(root.right, low, high);
    }
    return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);
    }
    }

    复杂度分析

    • 时间复杂度:O(n),其中n是二叉搜索树的节点数。每个节点最多被访问一次。
    • 空间复杂度:O(n)。空间复杂度主要取决于递归调用栈的深度。

    方法二:广度优先搜索

    广度优先搜索使用队列来实现,按层次遍历树节点。以下是详细的思路分析:

  • 初始化一个队列,将根节点加入队列。
  • while队列不为空,取出队首节点。
  • 如果节点为空,跳过。
  • 根据节点的值与low、high的关系决定加入队列的子节点:
    • 如果节点值大于high,加入左子树。
    • 如果节点值小于low,加入右子树。
    • 如果节点值在[low, high]范围内,加入左子树和右子树,并将节点值加到总和中。
  • 以下是对应的代码实现:

    import java.util.LinkedList;
    public class Solution {
    public int rangeSumBST(TreeNode root, int low, int high) {
    int sum = 0;
    LinkedList
    q = new LinkedList<>();
    q.offer(root);
    while (!q.isEmpty()) {
    TreeNode node = q.poll();
    if (node == null) {
    continue;
    }
    if (node.val > high) {
    q.offer(node.left);
    } else if (node.val < low) {
    q.offer(node.right);
    } else {
    sum += node.val;
    q.offer(node.left);
    q.offer(node.right);
    }
    }
    return sum;
    }
    }

    复杂度分析

    • 时间复杂度:O(n),其中n是二叉搜索树的节点数。每个节点最多被访问一次。
    • 空间复杂度:O(n)。空间复杂度主要取决于队列的大小。
    上一篇:如果你是一个程序员,这篇文章说出了你的心声
    下一篇:谁说“程序员离开电脑就是废物?”软件测试员第一个不服!

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2026年06月19日 13时00分33秒