資料結構與演算法 哈夫曼樹思想與建立詳解1

2022-02-24 22:14:38 字數 2740 閱讀 5941

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹(huffman tree)。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

假設一組權值,乙個權值是乙個結點,12  34  2  5  7  ,在這其中找出兩個最小的權值,然後組成乙個新的權值,再次找出最小的權值結點。如圖:

乙個二叉樹的結構體,乙個陣列的結構體。可以看出陣列的結構體內部是包含乙個二叉樹結點的結構體的。

/**

* created by 劉志通 on 2018/11/22.

* @describe 哈夫曼樹的簡介

* 程式設計思想:

* 1:方式簡介:

* 利用陣列(二叉樹結構體型別),來存放初始權值(首次認為權值就是乙個樹跟,左右孩子分別是null),在陣列初始化的之後排序,然後拿出index=0,1,更新

* 權值根,

* 2:所用知識:

* 陣列,鍊錶儲存,二叉樹結構體。

*/#include "stdlib.h"

#include "stdio.h"

/** * @describe 二叉樹結構體

* 結構形式:lchild data rchild

* */

typedef struct twotree twotree, *twotreel;

typedef struct arraymy;

arraymy initlist(arraymy &l) 

/** * 氣泡排序

* */

void swap(int *weigth,int n)}}

}

int listdelete(arraymy &l, int pos) 

printf("\n刪除%d\n",l.data[pos]->data);

int i;

//在插入的同時,i要保證在pos以及pos後方,入1,2,3,4,5當在第3個插入時,須把原有的第三個資料以及以後資料後移一位,空出第三個位置。

for (i = pos; i <= l.length; i++)

l.length--;

return 0;//返回0表示成功;

}int listinsert(arraymy &l, twotreel data)

}int i;

//在插入的同時,i要保證在pos以及pos後方,入1,2,3,4,5當在第3個插入時,須把原有的第三個資料以及以後資料後移一位,空出第三個位置。

for (i = l.length; i > pos; i--)

l.data[pos] = data;

l.length++;

return 0;

}/**

* 陣列初始化

* */

void arrayinit(int *weigth, int n, arraymy &arr)

printf("初始化成功");

}

這是最重要的一點,首先拿到前兩個權值結點,相加計算得到結果賦值給新建結點,然後刪除陣列中的前兩個結點,插入新建結點,然後遞迴重複此操作。

/**

* @describe 哈夫曼演算法

* */

arraymy hafumansf(arraymy &arr)

listinsert(arr, tc);//插入新建結點元素。

printf("\n插入後 ");

for(int i=0;idata);

}hafumansf(arr);//然後遞迴,重複上面操作。

} else

// printf(" geshu %d ",arr.length);

return arr;

}

//先中後序遍歷二叉樹

void diguibianli(twotreel tl, int xl) else else if (xl == 2) else if (xl == 3) }}

int main(void) ;

//排序(公升序)

swap(weigth,5);

//建立陣列(存放權值和個數)

arraymy arr;

arr = initlist(arr);

arrayinit(weigth, 5, arr);

//檢測陣列是否排序好

for (int i = 0; i < 5; i++)

//哈夫曼程式設計思想

arr = hafumansf(arr);

twotreel treel=arr.data[0];

printf("\n");

//先中後遍歷

printf("\n先序遍歷: ");

diguibianli(treel,1);

printf("\n中序遍歷:");

diguibianli(treel,2);

printf("\n後序遍歷:");

diguibianli(treel,3);

return 0;

}

完。

資料結構 哈夫曼樹與哈夫曼編碼

1 路徑 由乙個結點到另乙個結點之間的所有分支共同構成。2 路徑長度 結點之間的分支數目。3 樹的路徑長度 從樹的根結點到其他所有結點的路徑長度之和。4 權 賦予某一實體的值。在資料結構中,實體包括結點和邊,所以對應有結點權和邊權。5 結點的帶權路徑長度 結點與樹的根結點之間的路徑長度與結點權的乘積...

資料結構 哈夫曼樹與哈夫曼編碼

include pch.h include 哈夫曼樹類huffmantree的定義 huffman樹結點類treenode宣告 template class t class huffmannode 建構函式 huffmannode getleft void const void setleft hu...

資料結構 哈夫曼樹與編碼

哈夫曼樹的定義 1 輸出二叉樹,可在前序遍歷的基礎上修改。採用廣義 式,元素型別為int void printbtree int struct btreenode bt 2 根據陣列 a 中 n 個權值建立一棵哈夫曼樹,返回樹根指標 struct btreenode createhuffman el...