C C 實現哈夫曼樹和生成哈夫曼編碼

2021-09-24 21:25:00 字數 3256 閱讀 7375

用c語言實現哈夫曼樹和生成哈夫曼編碼,首先生成哈夫曼樹,哈夫曼樹是從中選取權值最小的兩個進行相加,將這兩個分別做為生成的左子樹和右子樹,左子樹要比右子樹小。然後將相加得到的值從新放入,然後又從中找到最小的兩個值,然後用這個兩個值一直相加,直到只剩最後乙個值,將這個值作為哈夫曼樹的根。

生成哈夫曼編碼,如果是左子樹的話為0,右子樹的話為1,從父節點還是往下找。然後這串**就是哈夫曼編碼。

上**

#include

#include

#include

#include

using

namespace std;

const

int lsize =

1000000

;typedef

struct

nodetree,

*huffmantree;

typedef

struct nodenode;

intgetlistsize

(char

*pstr)

return len;

}int

getlistlink

(node *head)

return a;};

//列印鍊錶

void

print

(struct node *head)

while

(p!=

null)}

;int

querynode

(node *head,

char ch)

p = p-

>next;

}return0;

//這個字元不存在};

//生成權值

node *

createweight

(char

*str)

// boos = boos->next;

//}}

else

str++;}

return head;};

void

createtree

(huffmantree &root,

int n,node *head)

node *q;

q = head-

>next;

int length =

2*n -1;

printf

("n is %d\n"

,n);

int hfcode[

100]

;//哈夫曼編碼陣列

root =

new nodetree[length+1]

;//初始化哈夫曼樹

for(

int i =

1;i<=length;i++

)//給哈夫曼樹賦值

for(

int i =

1;i<=n;i++

)//開始建立哈夫曼樹

for(

int i = n+

1; i <=length; i++)if

(root[j]

.parent ==

0&& root[j]

.weight >0)

}//將指標陣列中的指標指向的最小值賦值給索引號為k1的,次小值賦值給索引號為k2的

for(

int j = k2; j < i; j++

)else

if(root[j]

.weight < root[k2]

.weight)}}

//開始生成新的哈夫曼樹節點

root[k1]

.parent = i;

root[k2]

.parent = i;

// printf(" i is:%d\n",i);

// printf("k1 is :%d\n",k1);

// printf("k2 is :%d\n",k2);

// printf(" k1 weight is:%d\n",root[k1].weight);

// printf(" k2 weight is:%d\n",root[k2].weight);

root[i]

.order = i;

root[i]

.lift_child = k1;

root[i]

.right_child = k2;

root[i]

.weight = root[k1]

.weight + root[k2]

.weight;

}int start;

// hfcode[n-1]='\0';

//生成哈夫曼編碼

for(

int i =

1;i<=n;i++

)else

deep++

; start++

; c = f;

f = root[f]

.parent;

} root[i]

.deep = deep;

// printf("code is:%d\n",root[i].code[start]);}}

;//void creathfcode(nodetree *root,)

//列印哈夫曼樹的表態結構

void

printtree

(nodetree *root,

int n)

printf

("\n");

}};void

querycode

(nodetree *root,

int n)

// for(int i=0;i

// printf("%d ",query_list[i]);

// }

for(

int i=

1;i<=n;i++

) j++

; code--

;//printf("%d deep is %d\n",i,deep);

deep--;}

}//判斷是否找到對應的權重的值

// printf("deep is:%d\n",deep);

if(deep<0)

}// printf("flag is:%d\n",flag);

if(flag>0)

else};

intmain()

}

哈夫曼樹和哈夫曼編碼

1.帶權最短路徑wpl 2.哈夫曼樹是wpl最小的樹,但樹不一定唯一。左右子樹交換,大於二的同權重的樹的任意組合都會影響其唯一性。3.n個葉子節點的總節點數為2n 1。4.哈夫曼樹的建立,每次將兩個權重最小的樹組合乙個大樹 小樹消失,大樹插入。這裡的存在與否依據parent標記 直到還有一棵樹為止。...

哈夫曼樹和哈夫曼編碼

原文參照 1.基本概念 節點之間的路徑長度 在樹中從乙個結點到另乙個結點所經歷的分支,構成了這兩個結點間的路徑上的經過的分支數稱為它的路徑長度 樹的路徑長度 從樹的 根節點到樹中每一結點的 路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權 在一些應用中,賦予樹中結點的乙個有...

哈夫曼樹和哈夫曼編碼

在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼 huffman 樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的乙個應用。哈夫曼編碼應用廣泛,如jpeg中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉...