用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中就應用了哈夫曼編碼。首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉...