//已更改,之前是select函式存在問題 選出的s1與s2大小不定,故結果顯示不唯一。
#include #include#define error 0
#define ok 1
#define status int
#define n 1050
/*構造赫夫曼樹:n個初始結點,則赫夫曼樹中會存在2n-1個結點,0號位置不使用的情況下,共需要2n個結點;
思想: 1、初始化:將所有的單元中的雙親及其左右孩子的結點座標都初始化為0;再輸入前n個結點的值
2、通過n-1次的選擇、刪除、合併來建立赫夫曼樹:
選擇:從之前的所有結點中選擇雙親為0,並且其權值為最小的兩個;(這裡構造乙個select函式來進行選擇,選擇結果放入s1與s2中)
刪除:將選中的兩個結點的雙親改為非0;
合併:將s1和s2的權值相加,作為乙個新的結點權值,依次存入到陣列的第n+1之後的單元中,同時記錄這個新結點的左右孩子分別為s1,s2;並且雙親結點為0;
*//*
赫夫曼樹的應用:赫夫曼編碼:
選擇最優字首編碼的一種形式;
另外,赫夫曼編碼的實現是建立在已有赫夫曼樹的基礎上的;
思想:從結點開始向根結點回溯,將資料倒敘臨時存入乙個一維陣列中cd;start記錄編碼在cd中的起始位置;
當到最終的根結點時,將cd中的變法複製到該字元相應的編碼串中;
*///
結點型別:
typedef struct
lnode
lnode,*linklist;
void select(lnode f,int t,int &s1,int &s2)
else
}for(int i=1;i<=t;i++)
if(f[i].number0
) s1=i;
if(s1==s2) s2=m;
for(int i=1;i<=t;i++)
if(i!=s1 && f[i].number0
) s2=i;
if(s1>s2)
}void creat(linklist &l,int
n)//
初始化開設的陣列;
for(i=1;i<=n;i++)//
輸入前n個元素;
scanf("
%d",&l[i].number);
//我是乙個萬惡的分割線--------------------------------------初始化工作完畢!
for(i=n+1;i)
}//根據赫夫曼樹構造赫夫曼編碼:
void creat1(char hc[100][100],linklist &l,int
n)
/*hc[i]=new char[n-start];
*/strcpy(hc[i],&cd[start]);
//int p=0;
//for(j=start;j//
hc[i][p++]=cd[j];}}
intmain()
return0;
}
第五章樹和二叉樹
樹的邏輯結構 在樹中常常將資料元素稱為結點。任意一棵非空樹滿足以下條件 1 有且僅有乙個特定的稱為根的結點 2 當n 1時,除根結點之外的其餘節點被分成m m 0 個互不相交的有限集合t1,t2.tm,其中每個集合又是一棵樹,並稱為根節點的子樹。樹的定義是遞迴的。結點的度 某結點所擁有的子樹的個數 ...
第五章 樹和二叉樹
5.1 樹的邏輯結構 樹的定義 n n 0 個結點的有限集合。當n 0時,稱為空樹 任意一棵非空樹滿足以下條件 有且僅有乙個特定的稱為根的結點 當n 1時,除根結點之外的其餘結點被分成m m 0 個互不相交的有限集合t1,t2,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。樹的基本術語 結點...
第五章樹和二叉樹
結點的度 結點所擁有的子樹的個數。樹的度 樹中各結點度的最大值。葉子結點 度為0的結點,也稱為終端結點。分支結點 度不為0的結點,也稱為非終端結點。結點所在層數 根結點的層數為1 對其餘任何結點,若某結點在第k層,則其孩子結點在第k 1層。樹的深度 樹中所有結點的最大層數,也稱高度。層序編號 將樹中...