LeetCode 每日一题 938. 二叉搜索树的范围和

这篇博客介绍了如何利用二叉搜索树的性质来优化求解给定范围内节点值之和的问题。提供了两种方法,分别是中序遍历和深度优先搜索(DFS)。中序遍历虽然可行但效率不高,而DFS方法则巧妙地利用了二叉搜索树的特性,避免了不必要的搜索,提高了效率。代码示例展示了如何在满足条件的情况下分别遍历左子树和右子树,从而精确计算目标范围内的节点值总和。
摘要由CSDN通过智能技术生成

938. 二叉搜索树的范围和

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

示例 1:
在这里插入图片描述

输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32

示例 2:
在这里插入图片描述

输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23

提示:

  • 树中节点数目在范围 [1, 2 * 10^4]
  • 1 <= Node.val <= 10^5
  • 1 <= low <= high <= 10^5
  • 所有 Node.val 互不相同

方法一:中序遍历

可以采用「中序遍历」来遍历二叉树所有节点,找出在 val[low,high] 区间内的节点累加。

参考代码

public int rangeSumBST(TreeNode root, int low, int high) {
    int ret = 0;
    Deque<TreeNode> stack = new LinkedList<>();
    while (!stack.isEmpty() || root != null) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }
        root = stack.pop();
        if (root.val >= low && root.val <= high) {
            ret += root.val;
        }
        root = root.right;
    }
    return ret;
}

执行结果
在这里插入图片描述

方法二:深度优先搜索(DFS)

方法一的执行结果并不理想,原因在于我们并没有使用到「二叉搜索树」的特性,而是当成一颗普通二叉树在处理。

对于当前节点 root

  • root.val < low,没有必要去搜索 root.left,因为左边的节点都小于 root。
  • 同理 当 root.val > high,没有必要去搜索 root.right,因为右边的节点都大于 root。
  • 只有当 low <= roo.val <= high 时,需要两边都搜索。

参考代码

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

执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值