抽象类SegmentOperation.java:

public abstract class SegmentOperation<T> {public abstract T getMid(T o1, T o2);public abstract T getNext(T o1);public abstract int compare(T o1, T o2);
}

线段树实现SegmentTree.java:

public class SegmentTree<T> {private SegmentTree<T> treeRight;private SegmentTree<T> treeLeft;private boolean isLeaf;private T begin;private T end;private int value;SegmentOperation<T> oper;public SegmentTree(T beginT, T endT, int segmentValue, SegmentOperation<T> operT) {begin = beginT;end = endT;value = segmentValue;oper = operT;treeRight = null;treeLeft = null;isLeaf = true;}private void update(int segmentValue) {value = segmentValue;if ( treeLeft != null ) {treeLeft.update(segmentValue);}if ( treeRight != null ) {treeRight.update(segmentValue);}}public void insert(T beginT, T endT, int segmentValue) {if ( (oper.compare(begin, beginT) == 0) && (oper.compare(end, endT) == 0 ) ) {update(segmentValue);return;}if ( oper.compare(beginT, endT) == 0 ) {return;}T mid = oper.getMid(begin, end);T midNext = oper.getNext(mid);if ( isLeaf ) {treeLeft = new SegmentTree<T>(begin, mid, value, oper);treeRight = new SegmentTree<T>(midNext, end, value, oper);isLeaf = false;}if ( oper.compare(mid, endT) >= 0 ) {treeLeft.insert(beginT, endT, segmentValue);}else if ( oper.compare(midNext, beginT) <= 0 ) {treeRight.insert(beginT, endT, segmentValue);}else {treeLeft.insert(beginT, mid, segmentValue);treeRight.insert(midNext, endT, segmentValue);}}
}

代码中没有对Query Delete等方法进行实现,需要的话可以根据实际情况对其进行编写。

一个用JAVA实现的线段树类--泛型 重构.相关推荐

  1. bzoj4605 崂山白花蛇草水(动态开点线段树逃替罪羊重构K-D tree)

    首先我们发现它是一个三维的问题而且还强制在线 囧 我们可以考虑在外面来一个权值线段树,然后每次查询时在线段树二分即可,这样我们每个节点再套一棵K-D tree,用来查询有多少个点被框住了,然后因为是不 ...

  2. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

  3. 杭电1166敌兵布阵(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  5. 线段树 --算法竞赛专题解析(24)

    本系列文章将于2021年整理出版.前驱教材:<算法竞赛入门到进阶> 清华大学出版社 网购:京东 当当   作者签名书:点我 有建议请加QQ 群:567554289 文章目录 1. 线段树概 ...

  6. FZU 2297 Number theory【线段树/单点更新/思维】

    Given a integers x = 1, you have to apply Q (Q ≤ 100000) operations: Multiply, Divide. Input First l ...

  7. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  8. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  9. hdu2492 数状数组或者线段树

    题意:      给你一些人,每个人有自己的攻击力,输入的顺序就是每个人的顺序,他们之间互相比赛,两个人比赛的条件是必须在他们两个位置之间找到一个人当裁判,这个裁判的攻击力必须在他们两个人之间,问你最 ...

最新文章

  1. TFTP commons-net-3.3.jar
  2. python为什么从0开始_为什么大多数编程语言中,索引都是从0开始
  3. python中格式化_Python中格式化的两种方法
  4. 《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解
  5. Maven项目中使用JUnit进行单元测试
  6. 大数据常用数据库汇总
  7. 贪心的Mixing Milk(洛谷P1208题题解,Java语言描述)
  8. And(CF-1013B)
  9. 个人简介页面如何设计?集设网优秀案例给你灵感
  10. 顶岗实习周记java方向_JAVA软件开发——顶岗实习周记25篇.doc
  11. sublime中文件前缀的自动添加
  12. 为什么说Mac比windows更安全?
  13. fastboot下载大镜像报错 remote: data too large
  14. Linux centos 7安装
  15. 探索图片透明度叠加方式
  16. linux系统中打rz命令后出现waiting to receive.**B0100000023be50
  17. Tair存储引擎简单介绍以及常见API操作
  18. #路由配置以及华为路由协议优先级
  19. 阿里云服务器和 hexo 博客实战
  20. MIT 18.02 多变量微积分总结(Part II)

热门文章

  1. 【SeeMusic】下载安装并注册 SeeMusic 软件
  2. 【运筹学】运输规划 ( 运输规划基变量个数分析 )
  3. 【计算机网络】计算机网络 标准化及组织 ( 标准化工作 | 标准化工作流程 | 标准化工作组织 )
  4. 初学jQuery之jQuery虚假购物车-------与真实数据无关
  5. HTML5小游戏《智力大拼图》发布,挑战你的思维风暴
  6. iOS中正则表达式的基本使用方法
  7. Jackson 框架使用说明,轻易转换JSON【转】
  8. Flash 与物理笔记:简单的小球重力模拟
  9. 汇编中的BP与SS组合时,BP里面放的到底是SS中的一个基地址的指针还是基地址本身?
  10. 如何在matlab sfunction 函数中调用自己写的函数?