點樹的簡單實現(極省空間)

2022-03-05 17:46:55 字數 2168 閱讀 7982

思路:先畫一棵完全二叉樹, 為節省空間,採用陣列來實現。對這棵二叉樹,葉子用於存放資料,節點用於統計葉子資訊。

通過下面的三種方法,進一步節省空間:

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...