线段树模板

package segmentTree;public class SegmentTree {private class Segment {  int left;  int right;  int count;  Segment leftChild;  Segment rightChild;  }  private Segment root;  public SegmentTree (int left, int right) {  root = new Segment();  build(root, left, right);  }  public void insert(int left, int right) {  insert(root, left, right);  }  public int caculateExistingTimes(int target) {  return caculateExistingTimes(root, target);  }  //从根节点开始查找叶子结点[target, target],对经过的节点的count求和  private int caculateExistingTimes(Segment root, int target) {  int result = 0;  while( root.left != root.right) {  int rootMid = root.left + (root.right - root.left) / 2;  result += root.count;  if (target <= rootMid) {  root = root.leftChild;  } else if (target > rootMid) {  root = root.rightChild;  }  }  return result;  }  private void build(Segment root, int left, int right) {  root.left = left;  root.right = right;  if (left != right) {  int mid = left + (right - left) / 2;  root.leftChild = new Segment();  root.rightChild = new Segment();  build(root.leftChild, left, mid);  build(root.rightChild, mid + 1, right);  }  }  private void insert(Segment root, int left, int right) {  int rootLeft = root.left;  int rootRight = root.right;  int rootMid = rootLeft + (rootRight - rootLeft) / 2;  //匹配,出现次数加1  if (left == rootLeft && right == rootRight) {  root.count++;  return;  }  if (right <= rootMid) {  insert(root.leftChild, left, right);  } else if (left > rootMid){  insert(root.rightChild, left, right);  } else {  insert(root.leftChild, left, rootMid);  insert(root.rightChild, rootMid + 1, right);  }  }  }

测试源码 test.java

/** * 线段树入门 * 问题:已知线段[2,5] [4,6] [0,7];求点2,4,7分别出现了多少次 * 以下代码建立的线段树用链表来保存,且树的叶子结点类似[i,i] */  package segmentTree;
import segmentTree.SegmentTree;public class test {public static void main(String[] args) {  SegmentTree tree = new SegmentTree(0, 7);  int[][] segments = {  {2, 5},   {4, 6},   {0, 7}  };  int[] targets = {2, 4, 7};  for (int i = 0, len = segments.length; i < len; i++) {  int[] segment = segments[i];  tree.insert(segment[0], segment[1]);  }  for(int target : targets) {  System.out.println(target + ":" + tree.caculateExistingTimes(target));  }  }  }

java 数据结构源码--线段树相关推荐

  1. java 数据结构源码--Trie树

    node package trieTree;public class TrieTreeNode {final int MAX_SIZE=26; int nCount;//记录该字符出现次数 char ...

  2. 数据结构源码笔记(C语言):Huffman树字符编码

    #include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...

  3. 数据结构源码笔记(C语言):哈夫曼树

    #include <stdio.h> #include <stdlib.h> #define MAXINT 2147483647 #define MAXNUM 50 #defi ...

  4. 数据结构源码笔记(C语言):B树的相关运算算法

    //B树的相关运算算法#include<stdio.h> #include<malloc.h>#define MAXM 10//定义B树最大的阶数 typedef int Ke ...

  5. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  6. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  7. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  8. 数据结构源码笔记(C语言):快速排序

    //实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  9. 数据结构源码笔记(C语言):冒泡排序

    //冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

最新文章

  1. python学精通要多久-零基础零经验自学Python,到精通Python要多久啊?
  2. 【Linux】【服务器】 CentOS7下安装Redis详细过程步骤
  3. 【NOI1995】石子合并
  4. 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画
  5. Oracle adviser,Oracle10g SQL tune adviser
  6. CSS每日学习笔记(3)
  7. 人工智障学习笔记——机器学习(1)特征工程
  8. Linux系统的启动引导过程(转)
  9. Python学习之路_day_25(面向对象之封装/多态/组合)
  10. 云计算技术前景怎么样?
  11. python串口数据分包_python TCP Socket的粘包和分包的处理详解
  12. rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...
  13. ssm毕设项目自来水收费管理系统7yd5p(java+VUE+Mybatis+Maven+Mysql+sprnig)
  14. 二级考试内容之C和Python
  15. qemu毒液漏洞分析(2015.9)
  16. 动态图象专家组 MPEG-4
  17. SysTick系统滴答定时器
  18. Easyrecovery2022硬盘磁盘U盘免费数据恢复软件
  19. DSP视频教程第2期:系统介绍ARM DSP数字信号处理库以及超简单的移植方法分享(2022-01-27)
  20. Linux chmod命令用法

热门文章

  1. 【Java 网络编程】网络相关概念
  2. MySQL 搜索指定时间范围数据, 时间字段有索引但是还是很费时
  3. lunix下的redis数据库操作——hash(哈希)
  4. 关于使用data()获取自定义属性出现undefined的说明
  5. bzoj 2962 序列操作
  6. G面经prepare: Pattern Match
  7. C#获取邮件客户端保存的邮箱密码
  8. 双击打开excel时提示:向程序发送命令时出现问题
  9. 香港科技园公司“牵手”腾讯 共推香港金融科技发展
  10. 内排序及时间复杂度分析-插入排序选择排序交换排序归并排序分配和索引排序对比...