TypeScript版線段樹

2021-09-19 06:44:22 字數 843 閱讀 5685

脫離acm隊伍已經一年多了,現在還能手寫的演算法不多,線段樹是其中一種。謹以此文紀念逝去的acm生涯

線段樹是一種二叉搜尋樹,常用於區間求和、區間求極值,其查詢和更新時間複雜度是o(logn)。

線段樹的主要操作包括初始化、更新和查詢

1.初始化

初始化過程是乙個遞迴演算法,從根節點遞迴全樹。作用是設定子節點區間範圍、區間和、子節點索引以及父節點的左右子節點索引

2.查詢

查詢過程是乙個遞迴演算法,從根節點遞迴全樹。首先初始化全域性變數res值為0,用以儲存結果,然後尋找最淺的被查詢區間包含的節點。若節點左右邊界均不在查詢區間內,直接return;若節點左右邊界均在查詢區間內,該節點區間值與res相加,return;否則繼續遞迴節點。

3.更新

更新過程與查詢比較類似,這裡不再贅述,其區別是更新會遞迴到最深的子節點,而不是查詢那樣淺嘗輒止

話不多說,還是上**吧

class linetree 

else if(left <= node.left && right >= node.right)

else

}public query(left: number, right: number): number

private callupdate(node, index, value)

else

else }}

public update(index: number, value: number): void

}

線段樹普及版

ps 此處以詢問區間和為例 線段樹之所以稱為 樹 是因為其具有樹的結構特性。線段樹由於本身是專門用來處理區間問題的 包括 rmq rsq 問題等 所以其結構可以近似的看做一棵二叉查詢樹 emmmmm 圖是從網上偷的 對於每乙個子節點而言,都表示整個序列中的一段子區間 對於每個葉子節點而言,都表示序列...

指標版的線段樹

includeusing namespace std const int n 1000005 struct node tree n int x,t,outit n long long ans vectoraqueue n struct point data n void buildtree node...

非遞迴版線段樹模板

摘自這裡 0 定義 define maxn 100007 int a maxn n,n 原陣列,n為原陣列元素個數 n為擴充元素個數 int sum maxn 2 區間和 int add maxn 2 懶標記 1 建樹 void build int n 2 點修改 a l c void update...