1. 程式人生 > >哈夫曼樹的構造-C語言

哈夫曼樹的構造-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) 路徑和路徑長度