哈夫曼樹的構造-C語言
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int weight,parent,lchild,rchild;
} HNode;
void HuffTree(HNode Huff[],int n)
{
int i,j,m1,m2,x1,x2; //m1,m2代表的是每次集合中最小的兩個權重,x1,x2即為他們的下標.
for(i=0; i<2*n-1; i++)
{
Huff[i].weight=0;
Huff[i].parent=-1;
Huff[i].lchild=-1 ;
Huff[i].rchild=-1;
}
printf("Input 1~n value of leaf:\n");
for(i=0; i<n; i++)
scanf("%d",&Huff[i].weight);
for(i=0; i<n-1; i++) //這裡n-1不是很理解
{
m1=m2=32767;
x1=x2=0;
for(j=0; j<n+i; j++)
{
if(Huff[j].parent==-1 && Huff[j].weight<m1)
{
m2=m1;
x2=x1;
m1=Huff[j].weight;
x1=j;
}
else if(Huff[j].parent==-1 && Huff[j].weight<m2)
{
m2=Huff[j].weight;
x2=j;
}
}
Huff[x1].parent=n+i;
Huff[x2].parent=n+i;
Huff[n+i].weight=Huff[x1].weight+
Huff[x2].weight;
Huff[n+i].lchild=x1;
Huff[n+i].rchild=x2;
}
printf ("Huff weight lchild rchild parent\n");
for(i=0;i<2*n-1;i++)
printf("%3d%5d%10d%10d%10d\n",i,
Huff[i].weight,Huff[i].lchild,
Huff[i].rchild,Huff[i].parent);
}
int main()
{
HNode Huff[100]={};//空間要足夠大,至少要大於2n-1
HuffTree(Huff,4);
printf("Hello world!\n");
return 0;
}
書上說要進行n-1次合併才能使初始的二叉樹最終合併成一棵二叉樹,n-1不是很理解,希望那位大神可以解惑。
相關推薦
哈夫曼樹 (c語言)資料結構
for(i=1;i<=len;i++){if(ht[i].w<min2&&ht[i].p==0&&i!=*s1){min2=ht[i].w;*s2=i;}}//找到另一個最小的元素 } hfmsNode *createhfms(int n)//構造哈夫曼樹 {
資料結構之哈夫曼樹(c語言)
哈夫曼樹 利用靜態連結串列建立赫夫曼樹,建樹過程中要求左子樹權值小於右子樹權值,求各結點的編碼。要求:葉子結點的個數n及結點值由鍵盤錄入。本題給出程式程式碼,要求修改以滿足測試要求. #include "stdio.h" #include "malloc.h" #in
哈夫曼樹與哈夫曼編碼(C語言程式碼實現)
在一般的資料結構的書中,樹的那章後面,著者一般都會介紹一下哈夫曼(HUFFMAN)樹和哈夫曼編碼。哈夫曼編碼是哈夫曼樹的一個應用。哈夫曼編碼應用廣泛,如 JPEG中就應用了哈夫曼編碼。 首先介紹什麼是哈夫曼樹。哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂
哈夫曼樹(C++優先隊列的使用)
name sub pan main 道理 輸出 tor 數據 排序。 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。 構造 假設有n個權
哈夫曼壓縮演算法C語言實現——步驟,詳細註釋原始碼
哈夫曼壓縮演算法的詳細實現步驟: 1、定義哈夫曼樹節點,用結構體。 2、利用C語言檔案讀寫,統計字元個數。 3、根據字元個數建立哈夫曼樹(不懂haffman資料結構的自己查下資料,我這裡就不再重複了) 4、根據哈夫曼樹為每個出現的字元編碼 5、壓縮:這裡涉及到位操作,用ch
哈夫曼樹構造
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Fri Jul 27 18:08:26 2018 @author: luogan """ # 樹節點類構建 class TreeNod
貪心演算法之哈夫曼編碼(C語言實現)
如題 問題描述:現有一個文字檔案,其中包含的字元資料出現的次數各不相同,先要求對該文字中包含的字元進行編碼,使文字佔用的位數更小。 問題分析 我們知道檔案的儲存都是以二進位制數表示的,如:字元c可以表示為010101…之類的。因 為不同的作業
哈夫曼樹的構造-C語言
#include <stdio.h> #include <stdlib.h> typedef struct { int weight,parent,lchild,rchild; } HNode; void HuffTree(HNo
構造哈夫曼樹c語言程式
#include<string.h>#include<stdlib.h>#include<stdio.h>int m,s1,s2;typedef struct{ unsigned int weight; unsigned int paren
構造哈夫曼樹並求帶權路徑長度(c語言/CodeBlocks實現)
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <math.h>
[C語言]哈夫曼樹(Huffman)的構造與實現
C語言資料結構中哈夫曼樹是個重要的內容。哈夫曼主要是它的編碼應用可以保證譯碼的非二義性。 每天堅持編寫一個程式,持之以恆,我們就會更加熟練的進行程式設計,從而為以後打下基礎。 下面是今天編寫的HUffman樹的原始碼,因為純手寫,沒有執行,瞭
轉載:哈夫曼樹的構造和哈夫曼編碼(C++代碼實現)
作者 pos blank 字符 element start man null == 作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h>
哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋)
** 哈夫曼樹詳細講解(帶例題和C語言程式碼實現——全註釋) ** 定義 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的 路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點
資料結構——哈夫曼樹的實現以及編碼(C語言實現)
1、問題描述 利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮簡訊息傳輸時間,降低傳輸成本。構造哈夫曼樹時,首先將由n個字 符形成的n個葉子結點存放到陣列HuffNode的前n個分量中,然後根據哈夫曼方法的基本思想,不斷將兩個較小的子樹合併為一個
C/C++語言之哈夫曼樹
原始碼: //哈夫曼樹演算法 #include <stdio.h> #include <stdlib.h> #define MAX_VALUE 20 typedef struct // 一個結點 { int Weight;
資料結構:C語言實現構建哈夫曼樹
哈夫曼樹(霍夫曼樹)又稱為最優樹. 1、路徑和路徑長度 在一棵樹中,從一個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第L層結點的路徑長度為L-1。 2、結點的權及
哈夫曼樹(一)之 C語言詳解
/* * 建立Huffman樹 * * 引數說明: * a 權值陣列 * size 陣列大小 * * 返回值: * Huffman樹的根 */ HuffmanNode* create_huffman(Type a[], int size) {
資料結構之---C語言實現哈夫曼樹和編碼
//哈夫曼樹 //楊鑫 #include <stdio.h> #include <stdlib.h> typedef int ElemType; struct BTreeNode { ElemType data; struct BTr
資料結構 樹 哈夫曼樹及編碼 C語言版
//哈弗曼編碼的演算法 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 50//葉子結點的最大值 #define M 2*N-1 //所有結點的最
哈夫曼樹C++實現詳解
哈夫曼樹的介紹 Huffman Tree,中文名是哈夫曼樹或霍夫曼樹,它是最優二叉樹。 定義:給定n個權值作為n個葉子結點,構造一棵二叉樹,若樹的帶權路徑長度達到最小,則這棵樹被稱為哈夫曼樹。 這個定義裡面涉及到了幾個陌生的概念,下面就是一顆哈夫曼樹,我們來看圖解答。 (01) 路徑和路徑長度