思路:先畫一棵完全二叉樹, 為節省空間,採用陣列來實現。對這棵二叉樹,葉子用於存放資料,節點用於統計葉子資訊。
通過下面的三種方法,進一步節省空間:
1 節點只記錄左子樹葉子資訊,右子樹葉子資訊通過當前節點和父節點等節點的值計算得出。
因而需要指定乙個點,當作根節點的「父節點」,以便計算根節點右子樹資訊。
可以將根節點從1開始編號,對節點i,左孩子編號為2*i,右孩子編號為2*i+1,並用編號0記錄整根樹所有葉子的資訊。
2 對某些應用,葉子資訊可以通過節點資訊計算得出,因而不儲存葉子資訊,
3 完全二叉樹,邊界要求為2^k,為了表示[0, n)這n個點,需要將n增加到2^k,實際上,
只要第n個葉子的父節點r存在就可以了,編號大於r的節點根本不會被訪問到,因而沒必要分配空間
//若表示的區間為[0, m), 則 n >= (m+1+extra)/2, 其中extra為大等於m的最小2^t
//完全二叉樹,根節點為1,對節點i,左孩子為2*i,右孩子為2*i+1
//節點編號範圍[1, extra) 葉子編號範圍[extra, 2*extra), 點n 對應 葉子n+extra,
//為節省空間,只記錄各節點左子樹下的葉子的個數,不記錄葉子出現的個數
//info[0] 儲存所有葉子的總個數, info[i]記錄節點i的左子樹下的所有葉子的總個數)
template
<
intm, typename t
=int
>
//區間[0, m)
class
pointtree ;
//t data[m];
t info[n];
public
:pointtree()
void
clear()
intsize()
intcapacity()
void
add(
intn)
void
erease(
intn)
void
erease_safe(
intn)
intcount(
intn)
while
(i %
2u);
return
info[i /2u
] -sum;
}int
lt(int
n) int
lteq(
intn)
intgt(
intn)
intgteq(
intn)
intoperator
(int
n) else }
returni -
extra;
}};
intra(
intarr,
intlen)
//求逆序數
template
<
intn
>
intrb(
intarr,
intlen)
//求逆序數 點樹實現
return
sum;
}int
main()
;printf(
"%d \n
", ra(arr, n));
printf(
"%d \n
", rb
<
n>
(arr, n));
}
字典樹的簡單實現
trie樹,又稱為字典樹,是一種樹形結構,是一種雜湊樹的變種,是一種用於快速檢索的多叉樹資料結構。用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。它有3個基本性質 1 根節點不包含字元,除根...
左偏樹的簡單實現
左偏樹,顧名思義,就是向左傾斜的樹 這棵破樹就是用來實現可並堆的,也就是說,是比堆多出了乙個合併的操作 左偏樹的定義是 左邊的節點個數大於右邊的節點個數 這就使其可以資瓷合併的操作 比二叉堆的o size1 size2 快多了 這是o logsize1 size2 三個性質 中要維護的三個性質 還是...
字首樹的簡單實現
1.字首樹 字首樹又稱為單詞查詢樹,是一種樹形的結構,用於儲存大量的字串,它的優點是 利用字串的公共字首來節約儲存空間 trie樹主要是利用詞的公共字首縮小查詞範圍 通過狀態間的對映關係避免了字元的遍歷,從而達到高效檢索的目的 2.可以先宣告乙個節點trienode,節點包括以下幾個屬性 trien...