1. 程式人生 > >資料結構----線段樹----線段樹的定義與構造

資料結構----線段樹----線段樹的定義與構造

一、什麼是線段樹?

1、線段樹是一棵二叉樹,樹中的每一個結點表示了一個區間[a,b]。
2、每一個葉子節點表示的是一個單位區間。
3、根節點表示的是“整體”的區間。
4、對於每一個非葉結點所表示的區間[a,b]:
左兒子表示的區間為[a,(a+b)/2]
右兒子表示的區間為[(a+b)/2+1,b]

二、線段樹有什麼用?

線段樹主要用於處理一些關於區間對映的問題。

我們需要經常處理可以對映在一個座標軸上的一些固定線段。

由於線段是可以互相覆蓋的,有時需要動態地合併線段,例如取得並區間的總長度,或者並區間的個數等等。

一個線段是對應於一個區間的,因此線段樹也可以叫做區間樹。

三、線段樹的結構

如圖:(每一個節點表示一個區間)


也可以這樣表示:


我們現在知道了線段樹的結構,那應該怎麼定義一棵線段樹呢?

很簡單,可以直接定義一個結構體陣列:

struct node{

    int l,r;//可以在結構體裡面增加一些需要的變數。
}tree[maxn];

線段樹的每個節點上往往都增加了一些其他的域。

在這些域中儲存了某種動態維護的資訊,視不同情況而定。

這些域使得線段樹具有極大的靈活性,可以適應不同的需求。

四、線段樹的表示方法

其實線段樹的表示方法跟完全二叉樹的表示方法是一樣的,只不過完全二叉樹的節點是滿的,兩個節點之間沒有空節點,線段樹的兩個節點之間可能存在空節點,所以線段樹比較耗空間,一般空間都要開到4n左右。

當然,線段樹也可以用動態資料結構來表示(比如說指標),但是寫起來比較麻煩,而且容易寫錯,所以一般都用完全二叉樹的方法來表示。