樹之習題選講

2021-10-03 10:03:46 字數 1404 閱讀 8852

核心演算法

void

solve

(int prel,

int inl,

int postl,

int n )

root = pre[prel]

; post[postl+n-1]

= root;

for( i=

0; i( in[inl+1]

== root )

break

; l = i; r = n-l-1;

solve

( prel+

1, inl, postl, l)

;solve

( prel+l+

1, inl+l+

1, postl+l, r)

;}

完全二叉樹

樹的表示法 :鍊錶 vs. 陣列

陣列完勝

核心演算法

void

solve

(int aleft,

int aright,

int troot )

#include

intmain()

int

compare

(const

void

*a,const

void

*b)//可根據實際情況自己實現

huffman codes 的特點

最優編碼----總長度(wpl)最小

無歧**碼----字首碼:資料僅存在於葉結點

沒有度為1的結點----滿足1、2則必有3

注意:滿足2、3可不一定有1!!

核心演算法

計算最優編碼長度

minheap h =

createheap

( n )

;//建立乙個空的、容量為n的最小堆

h =readdata

( n )

;//將f讀入h->data中

huffmantree t =

huffman

( h )

;//建立huffman樹

int codelen =

wpl( t,0)

;

int

wpl( huffmantree t,

int depth )

2. 對每位學生的提交,檢查

- 長度是否正確 $\sum_^strlen(code[i]*f[i])$

- 建樹的過程中檢查是否滿足字首碼要求

線段樹選講

線段樹選講 線段樹是一種二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹 最後的子節點數目為n,即整個線段區...

Leetcode 70 100習題選講

73.矩陣置零 給定乙個 m x n 的矩陣,如果乙個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。如果遇到零就把行和列都變為零,那麼最後所有元素都是0,所以要先把要置零的行和列都存下來,然後再遍歷一遍即可。74.搜尋二維矩陣 編寫乙個高效的演算法來判斷 m x n 矩陣中,是...

習題 選數(tri樹)

小 s 要在 0,2 n 中選乙個整數 x 接著把 x 依次異或 m 個整數 a 1 sim a m 他想要最大化 x 的最終取值。然而問題並沒有這麼簡單,小 r 想要干預小 s 的選擇。在小 s 選出 x 後,小 r 會選擇恰好乙個時刻 剛選完數時 異或一些數後或是最後 將 x 變為 lfloor...