1. 程式人生 > >線段樹從零開始

線段樹從零開始

先考慮樹的最下層,將所有在區間[2,12]內的點選中,然後,若相鄰的點的直接父節點是同一個,那麼就用這個父節點代替這兩個節點(父節點在上一層)。這樣操作之後,本層最多剩下兩個節點。若最左側被選中的節點是它父節點的右子樹,那麼這個節點會被剩下。若最右側被選中的節點是它的父節點的左子樹,那麼這個節點會被剩下。中間的所有節點都被父節點取代。對最下層處理完之後,考慮它的上一層,繼續進行同樣的處理。 下圖為n=13的線段樹,區間[2,12],按照上面的敘述進行操作的過程圖:
由圖可以看出:在n=13的線段樹中,[2,12]=[2] + [3,4] + [5,7] + [8,10] + [11,12] 。 分解方法二:自上而下分解——利於計算
首先對於區間[1,13],計算(1+13)/2 = 7,於是將區間[2,12]“切割”成了[2,7]和[8,12]。
其中[2,7]處於節點[1,7]的位置,[2,7] < [1,7] 所以繼續分解,計算(1+7)/2 = 4, 於是將[2,7] 切割成[2,4]和[5,7]。
[5,7]處於節點[5,7]的位置,所以不用繼續分解,[2,4]處於區間[1,4]的位置,所以繼續分解成[2]和[3,4]。