目錄
為什麼要使用線段樹
什麼是線段樹
線段樹融合介面
線段樹實現
線段樹例題
/** * 融合介面
* @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...