日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 数据结构源码--线段树

發布時間:2025/6/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 数据结构源码--线段树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線段樹模板


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)); } } }



《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的java 数据结构源码--线段树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。