資料結構實驗樹和二叉樹的應用

2021-03-04 00:31:16 字數 1856 閱讀 6863

課程題目:

資料結構實驗

學院:班級:

姓名:學號:●實驗題目:樹和二叉樹的應用

●實驗內容:哈夫曼編碼設計

●實驗目的:掌握樹和二叉樹的概念及工作原理,運用其原理及概念完成上述實驗題中的內容。

●實驗要求:為了使學生更好的掌握與理解課堂上老師所講的概念與原理,實驗前每個學生要認真預習所做的實驗內容及編寫源程式偽碼(寫在紙上及盤中均可)以便在實驗課中完成老師所布置的實驗內容。

●實驗學時:4學時

●設計原理:利用二叉樹來設計二進位制的字首編碼。事先約定左分支表示字元『0』,右分支表示字元『1』,則可以根據根節點到葉子節點的路徑上分支字元組成的字串作為該葉子節點字元的編碼。

假設每種字元出現的次數為w(i),其編碼長度為l(i),只有n種字元則,文章的總長度為∑w(i)l(i)。對應到二叉樹上,置w(i)為葉子節點的權,l(i)為從根到葉子的路徑長度。則∑w(i)l(i)為二叉樹上帶權路徑長度。

由此,設計文章總長最短的二進位制字首編碼即為以n種字元出新的頻率作權,由此得到的二進位制字首編碼則為赫夫曼編碼。

●詳細程式清單及注釋說明:

#include

#include

#include

#include

#include

using namespace std;

typedef char** haffmancode;

typedef struct

htnode,*huffmantree;

void select(huffmantree &ht,int i,int &s1,int &s2)

n++;

for(;n<=i;n++)

}void huffmancoding(huffmantree &ht,haffmancode &hc,int *w,int n)

for(;i<=m;++i)

for(i=n;i

從葉子到根逆向求每個字元的赫夫曼編碼---

hc = (haffmancode)malloc((n+1)*sizeof(char*));//分配n個字元編碼的頭指標向量

cd = (char *)malloc(n*sizeof(char));//分配求編碼的工作區間

cd[n-1] = '\0';//編碼結束符

for(i=1;i<=n;++i)

free(cd);//釋放工作空間

}int main()

huffmancoding(ht,hc,w,n);

printf("赫夫曼編碼為:\n");

for(i=1;i<=n;i++)

return 0;

}●執行測試結果:

給定字元數:8

各字元權值:5、29、7、8、14、23、3、11

構建完成後的赫夫曼樹:

●實驗中所遇的問題及解決方法:

.程式在最後編譯時出現錯誤。

原因:程式在剛開始編寫的時候並沒有給出此程式所需要的全部標頭檔案,當程式引用系統自定義函式時,由於沒有這些標頭檔案,所以程式編譯沒有通過。

.程式在賦權值時出現錯誤,第乙個權值並沒有賦值給相對應的向量。

原因:在迴圈函式設計時出現錯誤,迴圈函式在賦初值時沒有考慮到程式未使用0號單元,所以當已被賦值的向量賦值給其他向量時,陣列中的第乙個數值被略過,導致程式結果出現錯誤。

.函式當中select函式的設計

select是構建赫夫曼樹的的核心構建函式。此函式的功能是為了區分給定字元中各種字元的權數的大小。並將其按順序排列,構建過程中,由於對演算法的結構認識不清楚,導致在應該區分s1和s2時,程式並沒有進行此項工作,造成了各個節點沒有按預期的得到應有的順序,程式執行異常。

通過設定輔助變數m區分s1和s2,區分後,通過迴圈結構將相應的權值賦給s1或s2。

資料結構練習二叉樹

學號 31301374 姓名張一博班級軟體工程1301 一 選擇題 1 按照二叉樹定義,具有3個結點的二叉樹共有 c 種形態。a 3 b 4 c 5d 6 2 具有五層結點的完全二叉樹至少有 d 個結點。a 9 b 15 c 31 d 16 3 以下有關二叉樹的說法正確的是 b a 二叉樹的度為2b...

資料結構試驗 二叉樹

實驗報告名稱 姓名學號專業班級 日期實驗6 二叉樹的建立及遍歷 一 實驗目的 1 學會實現二叉樹結點結構和對二叉樹的基本操作。2 掌握對二叉樹每種操作的具體實現,學會利用遞迴方法編寫對二叉樹這種遞迴資料結構進行處理的演算法。二 實驗要求 1 認真閱讀和掌握和本實驗相關的教材內容。2 編寫完整程式完成...

資料結構樹與二叉樹實驗報告

樹和二叉樹上機實習 1 實驗目的 1 熟悉二叉樹結點的結構。2 掌握對二叉樹基本操作的實現。3 理解遍歷的概念,會利用遞迴方法編寫對二叉樹結構進行遍歷的演算法。4 理解二叉樹的線索化過程是基於對二叉樹進行遍歷,而線索二叉樹上的線索又為相應的遍歷提供了方便。2 實驗要求 1 二叉樹的儲存及基本操作的實...