實驗名稱:樹和二叉樹的基本運算實現
指導教師:王瑩潔
專業班級:計163-1
姓 名:曹欣宇
學 號:201658503125
一、實驗題目
設計乙個程式exp7-6.cpp,構造一棵哈夫曼樹,輸出對應的哈夫曼編碼和平均查詢長度。並用表7.8所示的資料進行驗證。 單詞
the of
a to
and in
that he
is at
onfor
hisare be
出現頻度
1192
677541
518462
450242
195190
181174
157138
124123
表7.8 單詞及出現的頻度
二、實驗目的
掌握哈夫曼樹的構造過程和哈夫曼編碼的產生方法;靈活運用二叉樹這種資料結構解決一些綜合應用問題。
三、實驗要求
針對程式exp7-6.cpp,輸出結果如下:
見執行圖。
四、實驗步驟
(包括基本設計思路、演算法設計、函式相關說明、輸入與輸出以及程式執行結果)
基本設計思路:函式分塊程式設計。
演算法設計:設定乙個結構體typedefstruct node;用來儲存題目資訊。主函式中,先將頻度轉換為頻率,然後分別給樹的data域以及weight域賦值。先進入最小二叉樹函式,從權值中選取兩個最小的構成子樹,最後得到最小二叉樹。再進入編碼函式,給所有的左分支加上0,右分支加上1,即可得到哈夫曼編碼,最後輸出。
函式相關說明:void createht(htnode ht,intn)//生成最小二叉樹函式
void createhcode(htnodeht,hcode hcd,int n)//生成哈夫曼編碼函式
輸入:無。
輸出:見執行圖。
執行結果:
五、實驗心得體會
通過實驗,掌握了哈夫曼樹以及哈夫曼編碼的實現。
六、源程式清單(**)
#include #include #include #include using namespace std;
typedef struct
node;
typedef struct
htnode;
typedef struct
hcode;
htnode ht[20];//注:該程式中,此定義必須為全域性變數,否則不可執行,原因不詳.....
void createht(htnode ht,int n)
else if (ht[k].weight
}ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;
ht[i].rchild=rnode;
ht[lnode].parent=i;
ht[rnode].parent=i;
}}void createhcode(htnode ht,hcode hcd,int n)
hc.start++;
hcd[i]=hc;
}}int main()
,,,,,,,,,,,,,,};
hcode hcd[20];
double weight[20];
for(i=0; i<15; i++)
for(i=0; i<15; i++)
createht(ht,15);
createhcode(ht,hcd,15);
printf("輸出哈夫曼編碼:\n");
for (m=0; m<15; m++)
n1+=ht[m].weight;
sum+=ht[m].weight*j;
printf("\n");
}printf("平均長度=%f\n",sum/n1);
return 0;
}
資料結構上機 二叉樹
include include include using namespace std typedef char telemtype typedef struct binarytreenode node typedef node bintree 建立二叉樹,中間節點 左子樹 右子樹 node cre...
資料結構 樹和二叉樹
第一節 二叉樹的定義與基本操作 定義 我們把滿足以下兩個條件的樹型結構叫做二叉樹 binary tree 1 每個結點的度都不大於2 2 每個結點的孩子結點次序不能任意顛倒。由定義得出 二叉樹的每個結點只能含有0 1或2個孩子,且有左右之分。1 二叉樹的五種基本形態 2 二叉樹性質 性質1 二叉樹第...
資料結構 樹和二叉樹
定義 二叉樹是n n 0 個節點的有限集合,該集合或者為空集 稱為空二叉樹 或者由乙個根節點和兩棵互不相交的 分別稱為根節點的左子樹和右子樹的二叉樹組成。特點 每個節點最多有兩棵子樹 二叉樹是有序的,其次序不能任意顛倒 斜樹 1.所有節點都只有左子樹的二叉樹稱為左斜樹 2.所有節點都只有右子樹的二叉...