給定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...