C語言 編寫線段樹

weixin_44269491發表於2020-10-05

線段樹同樣也是一個比較冷門的資料結構,一般用於計算區域和,或者在修改某一個或幾個節點的資料時,計算區域資料和。
首先線段樹的特點是樹的葉子全是陣列中的數,而往上的節點都是相應子節點的和。
首先需要對陣列創造相應的樹結構。其中node為0也就是根節點,start和end指的是需要建立樹的陣列的起始和終點位置。而整個函式的思路為,mid為起點和終點的中點,根節點代表[start,end]的元素和,而它的兩個子節點就是[start,mid]和[mid+1,end],同時接著往下走,把陣列進一步進行劃分,由於用的是遞迴的方法,所以需要考慮遞迴出口,而出口就是找到的區域中只含有一個數字也就是到了葉子,其中存放nums[start]的值即可,而往上的根節點就是兩個葉子的和。
在這裡插入圖片描述
更新陣列和樹的思路是同樣的,通過二分的方法去找到需要更改的葉子節點也即是start == end的時候,這時將nums[idx]和tree[node]改為相應的數值,同時將向上的根節點的值相應更改。
在這裡插入圖片描述
查詢陣列區域和,這地方也同樣假如節點正好是所求區域就直接返回節點值,假如進入的區域在所求區域外直接返回0,假如找到葉子節點直接返回葉子節點的值。
在這裡插入圖片描述
用一個隨手打的陣列{1,2,11,25,31,5} 測試一下,計算[1,3]也就是2+11+25的結果:
在這裡插入圖片描述
結果如下:
在這裡插入圖片描述

相關文章