樹與二叉樹 哈夫曼樹

2022-03-12 02:40:29 字數 2395 閱讀 4003

(01) 路徑和路徑長度

定義:在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l-1。 

例子:100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。

(02) 結點的權及帶權路徑長度

定義:若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。 

例子:節點20的路徑長度是3,它的帶權路徑長度= 路徑長度 * 權 = 3 * 20 = 60。

(03) 樹的帶權路徑長度

定義:樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為wpl。 

例子:示例中,樹的wpl= 1*100 + 2*80 + 3*20 + 3*10 = 100 + 160 + 60 + 30 = 350。

哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 wpl 最小的二叉樹。

哈夫曼樹的構造過程:

哈夫曼編碼

規定哈夫曼樹中的左分支為0,右分支為1,則從根結點到每個葉結點所經過的分支對應的0和1組成的序列便為該結點對應字元的編碼。這樣的編碼稱為哈夫曼編碼

注意:在一組字元的哈夫曼編碼中,不可能出現乙個字元的哈夫曼編碼是另乙個字元哈夫曼編碼的字首。

測試**

1 #include2 #include

3#define n 50

4#define m 2*n - 1

5 typedef struct

6htnode;

1314 typedef struct

15hcode;

1920

void createht(htnode ht, int

n)21

40else

if (ht[k].weight

4145

}46 ht[node1].parent = i; //

合併兩個最小的和次小的節點

47 ht[node2].parent =i;

48 ht[i].weight = ht[node1].weight +ht[node2].weight;

49 ht[i].lchild =node1;

50 ht[i].rchild =node2;51}

52}5354

void createhcode(htnode ht, hcode hcd, int

n)55

72 hc.start++;

73 hcd[i] =hc;74}

75}7677

void disphcode(htnode ht, hcode hcd, int

n)78

90 printf("\n"

);91 m +=ht[i].weight;

92 sum += ht[i].weight*j;93}

94 printf("

\n平均長度 = %g\n

", 1.0 * sum /m);95}

9697

intmain()

98; //

節點值101

int fnum = ; //

權重102

htnode ht[m];

103hcode hcd[m];

104for (i = 0; i < n; ++i)

105109

110 createht(ht, n); //

建立哈夫曼樹

111 createhcode(ht, hcd, n); //

構造哈夫曼編碼

112 disphcode(ht, hcd, n); //

輸出哈夫曼編碼

113return0;

114 }

二叉樹與哈夫曼樹

1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

哈夫曼樹及二叉樹

一 昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了 哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和 include priority queueq 這個是最大堆 最小堆這樣寫 priority queue,greater q 另外,用vs20...