線段樹內容

2021-10-09 04:54:10 字數 3082 閱讀 9472

package code.wsq.notsubmit;

public

class

segmenttree

;int

segtree =

newint

[max_len]

;int start =0;

int end = arr.length -1;

int node =0;

// 構建線段樹

buildtree

(arr, segtree, start, end, node)

;for

(int i =

0; i <

15; i++

)// 查詢陣列的某線段內的數字和

int l =2;

int r =5;

int total_sum =

query

(segtree, start, end, node, l, r)

; system.out.

println

("the sum of ["

+ l +

","+ r +

"] is "

+ total_sum)

;// 更新線段樹

int idx =4;

int val =6;

update

(arr, segtree, start, end, node, idx, val)

;// 查詢陣列的某線段內的數字和

total_sum =

query

(segtree, start, end, node, l, r)

; system.out.

println

("the sum of ["

+ l +

","+ r +

"] is "

+ total_sum);}

/** * 構建線段樹

* @param arr 原始陣列

* @param segtree 儲存線段樹的陣列

* @param start 線段的起始位置

* @param end 線段的終止位置

* @param node 所在的節點位置

*/private

static

void

buildtree

(int

arr,

int[

] segtree,

int start,

int end,

int node)

int mid =

(start + end)

>>1;

int leftnode =

2* node +1;

int rightnode =

2* node +2;

buildtree

(arr, segtree, start, mid, leftnode)

;buildtree

(arr, segtree, mid +

1, end, rightnode)

; segtree[node]

= segtree[leftnode]

+ segtree[rightnode];}

/** * 查詢陣列的線段和

* @param segtree 構建好的線段樹

* @param start node節點對應的線段起始位置

* @param end node節點對應的線段終止位置

* @param node 當前節點坐在位置

* @param l 所求線段的起始位置

* @param r 所求線段的終止位置

* @return

*/private

static

intquery

(int

segtree,

int start,

int end,

int node,

int l,

int r)

if(r < start || l > end)

int mid =

(start + end)

>>1;

int leftnode =

2* node +1;

int rightnode =

2* node +2;

int sum_left =

query

(segtree, start, mid, leftnode, l, r)

;int sum_right =

query

(segtree, mid +

1, end, rightnode, l, r)

;return sum_left + sum_right;

}/**

* 更新線段樹

* @param arr

* @param segtree

* @param start

* @param end

* @param node

* @param idx

* @param val

*/private

static

void

update

(int

arr,

int[

] segtree,

int start,

int end,

int node,

int idx,

int val)

int mid =

(start + end)

>>1;

int leftnode =

2* node +1;

int rightnode =

2* node +2;

if(idx >= start && idx <= mid)

else

segtree[node]

= segtree[leftnode]

+ segtree[rightnode];}

}

線段樹 02 構建線段樹

public inte ce merger 不能再縮小的基本問題是 對treeindex指向的節點的情況進行討論 public class segmenttree 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treei...

線段樹 01 線段樹基礎

物理上 public class segmenttree public int getsize public e get int index 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引 private int leftchild int index 返回完全二叉樹的陣列表示中...

線段樹和zkw線段樹

好啦,我們就開始說說線段樹吧 線段樹是個支援區間操作和查詢的東東,平時的話還是蠻實用的 下面以最基本的區間加以及查詢區間和為例 線段樹顧名思義就是棵樹嘛,葉子節點是每個基本點,它們所對應的父親就是它們的和,具體如下圖 但是對於這樣的線段樹來說,操作所需的時間是遠達不到我們的要求的 會被t 因為我們會...