每個結點應該包含的資訊有:字元內容、父結點和左右孩子結點的下標、權重以及該字元的編碼。
struct hfnode};
class
huffmantree
void
selectmin
(int len,
int&s1,
int&s2)
else
if(ht[i]
.weight < min2)}}
}void
createhftree()
for(i =
1; i <= leafnum;
++i)
for(i = leafnum +
1; i <
2* leafnum;
++i)
}void
huffmancoding()
else
}for
(j = code.
length()
-1; j >=0;
--j)}}
void
huffmandecoding
(string str)
else
if(ch ==
'1')
else
if(ht[c]
.lchild ==
0&& ht[c]
.rchild ==0)
else}if
(ch ==
'\0'
)else
}void
transfertocode
(string str)}}
};
(1) 計算帶權路徑和(apl)如下圖中,葉子都用大寫字母表示,權值對應為:a-7,b-6,c-2,d-3樹的帶權路徑和 = 7*1 + 6*2 + 2*3 + 3*3 = 34
//全域性變數
//這裡的count是路徑數,初始傳入0
void
findapl
(binode* t,
int count)
findapl
(t->lchild, count +1)
;findapl
(t->rchild, count +1);}}
(2) 求二叉樹最大路徑
如下圖所示,共有4個葉子即有4條路徑,路徑1權值=5 + 4 + 11 + 7 = 27
路徑2權值=5 + 4 + 11 + 2 = 22
路徑3權值=5 + 8 + 13 = 26
路徑4權值=5 + 8 + 4 + 1 = 18
可計算出最大路徑權值是27。
該樹輸入的先序遍歷結果為abcd00e000fg00h0i00,各結點權值為:
//全域性變數
struct binode};
void
createbitree
(binode* t)
else
}void
inputweight
(binode* t)
}void
getmax
(binode* t)if(
!t->rchild)
max = max > t-
>weight ? max : t-
>weight;
//取最大路徑
getmax
(t->lchild)
;getmax
(t->rchild);}
}
演算法思路:將一條路徑中所有父結點的權重加到葉子結點上,就是這條路徑的路徑權值。用乙個全域性變數max去比較每次遍歷到的結點的權重,取最大值,最終能找到最大路徑權值。資料結構 赫夫曼樹
赫夫曼樹 huffman tree 又稱為最優樹,是一類帶權路徑長度最短的樹。本文僅討論最優二叉樹。樹的路徑長度是指從樹根到樹中其餘各個結點的路徑長度之和。對具有n個結點的二叉樹而言,完全二叉樹具有最短的樹的路徑長度。若在二叉樹中,樹葉結點帶有權值,則有 結點的帶權路徑長度定義為從樹根到該結點之間的...
資料結構 赫夫曼樹
赫夫曼編碼是首個試用的編碼方案。屬於無失真壓縮的編碼方案。在資料通訊中,赫夫曼編碼可以根據字元出現頻率,構造出一種不等長的二進位制,使編碼後的電文長度最短,且不產生二義性。weighteed path length是樹中所有節點的帶權路徑長度之和。wpl 值越小,說明構造出來的二叉樹效能越優。赫夫曼...
資料結構(八) 赫夫曼樹
一 基本介紹 1 給定n個權值作為n個葉子節點,構造一顆二叉樹,如果這個樹的帶權路徑長度達到最小,就叫做 最優二叉樹 也叫 赫夫曼樹 帶權路徑最短 最優二叉樹 赫夫曼樹 2 赫夫曼樹是帶權路徑長度最短的樹,權值較大的節點離根很近 二 重要概念 三 赫夫曼樹建立思路 乙個數列,要求轉成一顆赫夫曼樹 1...