核心演算法
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...