線段樹(區間樹)

2021-09-10 18:48:04 字數 3052 閱讀 3363

目錄

為什麼要使用線段樹

什麼是線段樹

線段樹融合介面

線段樹實現

線段樹例題

/** * 融合介面

* @author administrator

* * @param */

public inte***ce merger

package com.suanfa.segmenttree;

/** * 線段樹(區間樹)

* @author administrator

* */

public class segmenttree

// 在treeindex的位置建立表示區間[l...r]的線段樹

private void buildsegmenttree(int treeindex, int l, int r)

int lefttreeindex = leftchild(treeindex);

int righttreeindex = rightchild(treeindex);

// int mid = (l + r) / 2;

int mid = l + (r - l) / 2;

buildsegmenttree(lefttreeindex, l, mid);

buildsegmenttree(righttreeindex, mid + 1, r);

tree[treeindex] = merger.merge(tree[lefttreeindex], tree[righttreeindex]);

}public int getsize()

public e get(int index)

// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引

private int leftchild(int index)

// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的右孩子節點的索引

private int rightchild(int index)

// 返回區間[queryl, queryr]的值

public e query(int queryl, int queryr)

// 在以treeindex為根的線段樹中[l...r]的範圍裡,搜尋區間[queryl...queryr]的值

private e query(int treeindex, int l, int r, int queryl, int queryr)

// 在以treeindex為根的線段樹中更新index的值為e

private void set(int treeindex, int l, int r, int index, e e)

int mid = l + (r - l) / 2;

// treeindex的節點分為[l...mid]和[mid+1...r]兩部分

int lefttreeindex = leftchild(treeindex);

int righttreeindex = rightchild(treeindex);

if(index >= mid + 1)

set(righttreeindex, mid + 1, r, index, e);

else // index <= mid

set(lefttreeindex, l, mid, index, e);

tree[treeindex] = merger.merge(tree[lefttreeindex], tree[righttreeindex]);

}@override

public string tostring()

return res.tostring();}}

package com.suanfa.segmenttree;

/// 303. range sum query - immutable

///

/** * 求乙個陣列的區間和

* @author administrator

* */

class numarray

});}

}public int sumrange(int i, int j) }/*

public class numarray2

public int sumrange(int i, int j)

} */

package com.suanfa.segmenttree;

/// 303. range sum query - immutable

///

/** * 求乙個陣列的區間和

* @author administrator

* */

class numarray

});}

}public int sumrange(int i, int j) }/*

public class numarray2

public int sumrange(int i, int j)

} */

線段樹 區間樹

每乙個節點儲存的是乙個區間中相應統計值 在treeindex的位置建立表示區間 l.r 的線段樹 private void buildsegmenttree int treeindex,int l,int r int lefttreeindex leftchild treeindex int rig...

區間樹和線段樹

注意 區間樹和線段樹不一樣哦,線段樹是一種特殊的區間樹。區間樹 區間樹是在紅黑樹基礎上 進行擴充套件得到的支援以區間為元素的動態集合的操作,其中每個節點的關鍵值是區間的左端點。通過建立這種特定的結構,可是使區間的元素的查詢和插入都可以在o lgn 的時間內完成。相比於基礎的紅黑樹資料結構,增加了乙個...

線段樹 區間合併

hdu 1540 tunnel wa re 詳細見 include include include include include define max 50010 define lson l,m,k 1 define rson m 1,r,k 1 1 using namespace std typ...