LeetCode From Easy To Hard No4[Easy]: Range Sum of BST 求二叉树某个区间内的数的和

[树状数组] 区间求和的三种模型 树状数组在区间求和问题上有很高的效率,尤其在非常困难的比赛中(数据量大,对时间限制很严格的比赛)能发挥非常大的作用,其各种复杂度都要比线段树低很多,而且其代码简洁优美……有关区间求和,主要有以下三个模型: (以下设a[1…n]为一个长为n的序列,初始值全为0)1、改点求段型:即对于序列A有以下操作: 求整段区间的和:给定i,计算a1+a2+…+ai 修改单点:给定x和c,执行ax += c 这是最 阅读详情

Given the root node of a binary search tree, return the sum of values of all nodes with value between L and R(inclusive).

The binary search tree is guaranteed to have unique values.

 

Example 1:

Input: root = [10,5,15,3,7,null,18], L = 7, R = 15
Output: 32

Example 2:

Input: root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
Output: 23

 

Note:

  1. The number of nodes in the tree is at most 10000.
  2. The final answer is guaranteed to be less than 2^31.

方法顺序:

1.定义二叉树结构。

2.通过数组创建二叉树以便测试。

3.编写区间求和方法(两种情况,

①如根节点值在区间内,则加上根节点值,左右节点继续判断是否在区间内然后递归求和;

②如根节点不在区间内,则直接左右节点继续判断是否在区间内然后递归求和

)。

package test;

class Solution {
    /**
     * 1. 定义二叉树结构
     */
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    /**
     * 2. 数组转化为完全二叉树结构
     *
     * @param array 数组
     * @param index 下标
     * @return
     */
     TreeNode createBinaryTreeByArray(Integer[] array, int index) {
        TreeNode tree = null;
        if (index < array.length) {
            Integer value = array[index];
            if (value == null) return null;
            tree = new TreeNode(value);
            tree.left = createBinaryTreeByArray(array, 2 * index + 1);
            tree.right = createBinaryTreeByArray(array, 2 * index + 2);
        }
        return tree;
    }

    /**
     * 3. 二叉树区间求和
     * @param root 二叉树根节点
     * @param L 左区间 (包含)
     * @param R 右区间 (包含)
     * @return 区间和
     */
    public int rangeSumBST(TreeNode root, int L, int R) {
        if (root == null) {
            return 0;
        }
        // 如根节点值在区间内,则加上根节点值,左右节点继续判断是否在区间内然后递归求和
        if (root.val >= L && root.val <= R) {
            return root.val + rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
        }
        // 如根节点不在区间内,则直接左右节点继续判断是否在区间内然后递归求和
        return rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
    }


    public static void main(String[] args){
        Integer[] datas = new Integer[]{10,5,15,3,7,13,18,1,null,6};
        Solution solution = new Solution();
        TreeNode root = solution.createBinaryTreeByArray(datas, 0);
        System.out.println(solution.rangeSumBST(root, 7, 15));
    }

}

参考一下一些大牛在discuss中的解法,可以 reduce the nodes we need to travel~

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

顺便温习了一下二叉树的四种遍历方法

①前序遍历(先根节点再左最后右)

②中序遍历(先左节点再根最后右)

③后序遍历(先左节点再右最后根)

④层次遍历 (一层一层节点遍历)

 

package test;

import java.util.LinkedList;

class Solution {
    /**
     * 1. 定义二叉树结构
     */
    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    /**
     * 2. 数组转化为完全二叉树结构
     *
     * @param array 数组
     * @param index 下标
     * @return
     */
     TreeNode createBinaryTreeByArray(int index, Integer... array) {
        TreeNode tree = null;
        if (index < array.length) {
            Integer value = array[index];
            if (value == null) return null;
            tree = new TreeNode(value);
            tree.left = createBinaryTreeByArray(2 * index + 1, array);
            tree.right = createBinaryTreeByArray(2 * index + 2, array);
        }
        return tree;
    }

    /**
     * 3. 二叉树区间求和
     * @param root 二叉树根节点
     * @param L 左区间 (包含)
     * @param R 右区间 (包含)
     * @return 区间和
     */
    public int rangeSumBST(TreeNode root, int L, int R) {
        if (root == null) {
            return 0;
        }
        // 如根节点值在区间内,则加上根节点值,左右节点继续判断是否在区间内然后递归求和
        if (root.val >= L && root.val <= R) {
            return root.val + rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
        }
        // 如根节点不在区间内,则直接左右节点继续判断是否在区间内然后递归求和
        return rangeSumBST(root.left, L, R) + rangeSumBST(root.right, L, R);
    }

    //前序遍历
    public void preorder(TreeNode root) {
        if (root == null) return;
        System.out.println(root.val);
        preorder(root.left);
        preorder(root.right);
    }
    //中序遍历
    public void inorder(TreeNode root){
        if (root == null) return;
        inorder(root.left);
        System.out.println(root.val);
        inorder(root.right);

    }
    //    后序遍历
    public void postorder(TreeNode root){
        if (root == null) return;
        postorder(root.left);
        postorder(root.right);
        System.out.println(root.val);

    }

    /**
     * 层次遍历和其他三种遍历不一样,需要借助队列来实现
     * @param root
     */
    public void storeyTraversal(TreeNode root){
        if (root == null) {
            return;
        }
        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        list.add(root); // 先将根节点放进list
        while (!list.isEmpty()) {

            TreeNode currentNode = list.poll(); // 每次取出并移除list首元素
            if (currentNode != null) {
                System.out.println(currentNode.val);
                if (currentNode.left != null) {
                    list.add(currentNode.left);
                }
                if (currentNode.right != null) {
                    list.add(currentNode.right);
                }
            }
        }

    }

    public static void main(String[] args){
        Integer[] datas = new Integer[]{10,5,15,3,7,13,18,1,null,6};
        Solution solution = new Solution();
        TreeNode root = solution.createBinaryTreeByArray(0, datas);
//        System.out.println(solution.rangeSumBST(root, 6, 10));
//        solution.preorder(root);
//        solution.inorder(root);
//        solution.postorder(root);
        solution.storeyTraversal(root);
    }

}

 

数据结构与算法学习指南:从时间复杂度到动态规划 数据结构与算法是计算机科学的核心基础,用于高效组织和处理数据。其核心原理在于通过合理的数据组织(如数组、链表、树、图)和优化的计算步骤(算法),在有限资源下解决问题。掌握它们的技术价值巨大,能显著提升代码效率、系统性能,并培养严谨的计算思维,这是高级软件工程师和架构师的必备素养。在应用场景上,从数据库索引(B+树)、网络路由(图算法)、缓存设计(LRU)、到搜索引擎(Trie树)和推荐系统(排序与搜索),无处不在。本文聚焦于构建系统的算法知识体系,深入剖析了**动态规划**和**红黑树**等关键主题,为开发 阅读详情

相关推荐

国央企创新负责人如何实现科技创新资源的系统化管理和高效配置?.docx

国央企创新负责人如何实现科技创新资源的系统化管理和高效配置?

区间求和

问题 给出长度为N的数列。数列的初始值是1, 2, 3, …, N。但是这个数列频繁地发生变更,要求出这期间某个连续部分的和。假设N是5的情况。初始为1, 2, 3, 4, 5。在这个情况下,把第3个数字变更为9,第4个数变更为10的话,就会变成1, 2, 9, 10, 5。此时,如果要求第2个数到第5个数的和的话,输出26就可以了。然后,在这个状态下,将第1个数字变更为-5,第三个数变更为5...

算法学习印迹@老冯 1768

电池、AA‑CAES 与抽水蓄能多目标优化调度研究(三目标:成本、峰谷差、碳排放)(Matlab代码实现)

内容概要:本文针对电池、先进绝热压缩空气储能(AA-CAES)与抽水蓄能三种储能技术,构建了一个多目标优化调度模型,旨在协同优化电力系统的运行成本、负荷峰谷差和碳排放三个关键指标。研究采用Matlab进行代码实现,建立了综合考虑各类储能系统运行特性的精细化数学模型,并通过多目标优化算法求解Pareto最优前沿,深入分析了不同优化目标间的内在权衡与博弈关系。文中系统阐述了各储能单元的数学建模方法、系统运行约束条件的设定以及多目标优化问题的规范化处理流程,最终通过详细的仿真算例验证了所提模型与方法的有效性,充分展示了该调度策略在促进新能源消纳、降低系统综合运行成本和减少碳排放方面的巨大潜力与应用价值。; 适合人群:具备电力系统、能源经济或优化理论基础知识的研究生、科研人员及从事能源规划与调度的工程技术人员。; 使用场景及目标:①研究包含多种新型储能技术的综合能源系统协调调度问题;②学习如何建立电力系统多目标优化模型(涵盖经济性、环保性和运行稳定性);③掌握利用Matlab实现多目标优化算法并进行结果可视化分析与决策的方法。; 阅读建议:此资源以Matlab代码为核心,不仅提供了严谨的理论模型,更有完整的可运行代码实现。读者在学习时应结合代码深入理解模型构建的每一个细节,包括变量的定义、复杂约束的处理以及目标函数的加权聚合方法,并建议尝试修改模型参数或调整目标权重,以观察系统行为的动态变化,从而深化对多目标优化本质和工程应用的理解。

线段树区间求和

线段树区间求和略解 大致介绍: 线段树区间求和的算法大致由三个部分组成,分别是: Build函数:建立一个二叉树结构,每一个叶子(或根)储存一个区间的和,我的解法是通过递归实现; Add函数(有的博客称为Update函数):实现改变一个点的数值的功能; Query函数:实现查询功能,查询某一段的和为多少。 大致这三个功能可以满足我们大多数情况的需求。 然后,开始分析每一块代码的功能吧!o(*≧...

songziqi98的博客 1399

产业园区运营负责人如何精准匹配企业技术需求与科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

A股分钟数据涵盖股票、ETF、可转债及指数四大类 每条数据记录包含精确到分钟的时间戳,以及开盘价、最高价、最低价、收盘价、成交量、成交额六个核心字段 部分数据还提供前收盘价作为参考 股票与ETF数据细

A股分钟数据涵盖股票、ETF、可转债及指数四大类。每条数据记录包含精确到分钟的时间戳,以及开盘价、最高价、最低价、收盘价、成交量、成交额六个核心字段。部分数据还提供前收盘价作为参考。股票与ETF数据细分至1分钟、5分钟等周期,可转债在交易时段内逐笔生成分钟快照,指数数据则同步覆盖上证、深证等主要宽基指数,便于观察市场整体走势。 数据源:CMES金融数据库

[LeetCode] 938. Range Sum of BST 二叉搜索树的区间和

Given the rootnode of a binary search tree, return the sum of values of all nodes with valu...

azl397985856的专栏 245

产业园区运营负责人如何借助平台实现创新资源的动态配置与精准对接?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

[Leetcode学习-java] Range Sum of BST(二分搜索树区间相加)

问题: 难度:easy 说明: 题目输入一个BST,然后再给出一个范围 [a, b],要求返回落在区间内的 BST 元素相加结果。 问题链接:https://leetcode.com/problems/range-sum-of-bst/ 输入范围: Example 1: Input: root = [10,5,15,3,7,null,18], low = 7, high = 15 Output: 32 Example 2: Input: root = [10,5,15,3,7,13,18,1

qq_28033719的博客 203

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 126

保姆级教程:手把手教你从NASA Earthdata下载ASTER L2地表温度数据(附shp文件拖拽技巧)

本文提供了一份详细的NASA Earthdata平台ASTER L2地表温度数据下载教程,涵盖账号注册、数据筛选、shp文件拖拽技巧及质量检查等关键步骤。特别适合遥感领域初学者,帮助快速掌握高效获取ASTER L2T数据的方法,适用于城市热岛效应和农业监测等研究。

weixin_30736301的博客 470

论文阅读笔记----《From Easy to Hard: Two-stage Selector and Readerfor Multi-hop Question Answering》

本文截至目前(2022年7月1日),在Hotpot数据集上取得了最好的结果。

ray_paul1的博客 648

树莓派烧录验证失败:跳过验证步骤实现成功启动的实用技巧

本文针对树莓派烧录系统时常见的验证失败问题,提供了跳过验证步骤实现成功启动的实用技巧。通过分析Windows与Linux文件系统差异导致的SD卡验证报错,指导用户在烧录完成后立即关闭验证窗口,或使用BalenaEtcher等第三方工具规避问题,确保树莓派正常启动。

yyy34的博客 949

求出给定数组中某一段连续区间之和为某值的索引范围

给定一个数组以及一个目标数,求数组中一段连续的区间使得该区间元素之和为目标数。 例如num=[1,2,3,4,5] target=10 结果返回[0,3] 连续区间移动求解 def Sum(nums,sum): if nums==[]: return False add=0 j=0 for i in range(len(nums)): ...

LV的博客 780

保姆级教程:用ROS2 Humble和激光雷达,5分钟搞定机器人避障(附Python代码)

本文提供了一份详细的ROS2 Humble激光雷达避障实战指南,帮助开发者快速实现机器人避障功能。通过环境配置、硬件连接和Python代码实现,5分钟内即可让机器人自主避开障碍物。文章还涵盖了参数调优、常见问题排查及进阶优化技巧,适合机器人开发初学者和进阶用户。

weixin_42528902的博客 343

blender中合并的模型,在threejs中显示多个mesh;blender多材质烘培成一个材质

5、优化项(省略此步骤,直接进行步骤6),进入到视图着色方式(此时没有灯光,整体偏暗,如果不调整灯光,烘培出来的材质也偏暗,因此此步骤为优化项,通畅建议调整)。在右边栏进入世界环境,调整颜色。7、烘焙成功之后,新建一个材质,将第三步创建的纹理图像作为材质的纹理,连接到基础色,并把模型的材质改为此材质,其他的材质全部删除。2、处理uv,在侧边栏选择数据-uv贴图,选中使用的uv,进入编辑模式,全选,键盘u,选择智能uv投射。3、处理材质,在侧边栏选择材质,进入着色,在着色器编辑器新建一个图像纹理,新建图像。

AllBluefm的专栏 2530

LeetCode 938. Range Sum of BST 求二叉搜索树的区间和

一、题目 Given the root node of a binary search tree, return the sum of values of all nodes with value between L and R (inclusive). The binary search tree is guaranteed to have unique values. 二、代码 /** *...

可控的事情要谨慎,不可控的事情要乐观。 212

VMware Workstation Pro 25H2 去虚拟化精简便携版完全指南

虚拟机技术在现代开发和测试环境中扮演着重要角色,但客户机系统常因暴露虚拟化特征而被特定软件识别为“虚拟机”,导致功能受限。同时,官方 VMware Workstation Pro 安装包体积大、安装流程繁琐,难以实现移动化部署。去虚拟化通过修改 VMX 配置、屏蔽 CPUID 特征、反射宿主机硬件信息等手段降低被检测概率;精简与便携则通过裁剪非核心文件和改用脚本注册服务,实现即解压即用的轻量化形态。这类改版方案特别适合临时环境搭建、敏感软件兼容测试以及构建随身开发环境。本文从虚拟化检测原理出发,系统梳理了

weixin_34068198的博客 379

遍历二叉树:对二叉树的所有节点求和的两种方法(2)

方法1,类似于求二叉树的高度,有返回值 int Sum(TreeNode* T){ if(T==NULL)return 0; int sum=0; int lsum,rsum; lsum=Sum(T->left); rsum=Sum(T->right); sum=T->val+lsum...

qq_35299223的博客 6653

嵌入式Linux Qt/QML开发实战:从Buildroot配置到应用部署

本文详细介绍了嵌入式Linux Qt/QML开发全流程,从Buildroot系统配置、交叉编译工具链搭建到应用部署与调试。以RK3506开发板为例,提供实战指南,帮助开发者高效完成嵌入式应用开发,解决常见环境配置与性能优化问题。

m2n3o4p5的博客 229

用Java实现森林冰火人游戏

g.drawString("游戏结束", CELL_SIZE * COLS / 2 - 100, CELL_SIZE * ROWS / 2);g.drawString("难度级别: " + difficultyLevel, 10, CELL_SIZE * ROWS + 60);g.drawString("生命值: " + playerHealth, 10, CELL_SIZE * ROWS + 20);setTitle("森林冰火人");

2401_82778412的博客 1734

洛谷P3374(树状数组)

题目链接:https://www.luogu.org/problemnew/show/P3374题目描述如题,已知一个数列,你需要进行下面两种操作:1.将某一个数加上x2.求出某区间每一个数的和输入输出格式输入格式:第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。接下来M行每行包含3个整数,表示一个操作,具体如...

star_moon0309的博客 317

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LeetCode From Easy To Hard No10[Easy]: Unique Email Addresses 邮件地址的唯一性

very email consists of a local name and a domain name, separated by the @ sign. For example, inalice@leetcode.com,aliceis the local name, andleetcode.comis the domain name. Besides lowercase le...

我属码的博客 576

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

更新区间求和模板

参考链接:https://blog.youkuaiyun.com/u012469987/article/details/41357377 #include&lt;iostream&gt; #include&lt;cstdio&gt; using namespace std; const int MAXN = 100000; struct NODE{ int left; int right; lon...

guozuofeng的博客 329

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

线段树·POJ-3468·区间加减区间求和

题目大意:两种操作:C a b c  a-b区间加上c;Q查询区间和;解题思路:基本的线段树模板,唯一要提的就是和HDU-1698相比,lazy标记的处理不一样,这题需要区间加减,所以向下传递的时候需要加点,而HDU-1698是区间替换,只需要用lazy标记替换下一个即可;AC代码:#include &lt;map&gt; #include &lt;set&gt; #include &lt;sta...

吾之奉先的博客 593
上一篇: LeetCode From Easy To Hard No3[Easy]: Find Anagram Mappings 异构映射
下一篇: LeetCode From Easy To Hard No5[Easy]: Unique Morse Code Words 独一无二的摩斯密码
我属码
博客等级 码龄10年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值