博前感想:
哈夫曼樹算是二叉樹的應用,有兩個難點,乙個是建立新的節點,這裡面有優化的方法--比如排序的方法可以用快速排序什麼的;另外乙個難點就是哈夫曼編碼了。不說了,上**
**塊:
#include#include#include#includeusing namespace std;
typedef struct htree
htree, *htr;
htr root;
int x = 0;
int y = 0;
//string ch1 = ""; //全域性變數初始化
void create(htr &h, int &(n)) //一開始建立的結構體數目,並且把它們從小到大排序,不適合用冒泡
current->next = original;//; null //構成迴圈鍊錶,current->next是第乙個結構體
current->next->pre = current; //形成雙向鍊錶
//cout << current->next->data;
htr next = original;// = original->next;
htr temp1; //定義乙個臨時指標
char ch;
int temp2;
for (int j = 0; j < n; j++)
else //要交換的是結構體本身,而不是指標
}original = original->next; //外層迴圈多一次剛好可以讓original指向第乙個結構體
} //h = temp2;
h = original; //original這是指向第乙個結構體
//cout << original->data << " " << original->weight << endl; //測試建立的結構體沒有問題,應該是交換的迴圈出了問題
cout << "排序後的鍊錶為:" << endl;
for (int k = 0; k < n; k++) }
void createnode(htr &h, int n) //這裡h用&的話,值可以在別的地方公用,互通。
//t = t->next;
while(root->weight >= t2->weight) //這裡應該要有乙個迴圈
else}}
} h = h->next->next;
//cout << h->weight << " " << endl;
//cout << root->weight <<" "<< endl; 輸出root的值沒有出現錯誤
} h = root;
//#region測試語句
//cout << h->weight << endl;
//cout << h->lc->weight << endl;
//cout << h->rc->weight << endl;
//cout << h->rc->lc->weight << endl;
//cout << h->rc->lc->weight << endl;
//#endregion
}void preorder(htr h) //先序遍歷新構成的樹,檢驗是否正確
preorder(h->lc);
preorder(h->rc); }
root->s = "";
}string sq = "";
string sq_temp = "";
//int depth = 0;
htr w = null;
htr q = null;
void huf(htr h,string sq)
if (h->lc != null)
if (h->rc != null) }
int main()
資料結構 哈夫曼樹 哈夫曼編碼
哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...
哈夫曼編碼 哈夫曼樹 (資料結構)
哈夫曼編碼,又稱霍夫曼編碼,是一種編碼方式,哈夫曼編碼是可變字長編碼 vlc 的一種。huffman於1952年提出一種編碼方法,該方法完全依據字元出現概率來構造異字頭的平均長度最短的碼字,有時稱之為最佳編碼,一般就叫做huffman編碼 有時也稱為霍夫曼編碼 include include inc...
資料結構 哈夫曼樹
哈夫曼樹是二叉樹的一種。被稱為最優二叉樹。實際應用中最重要的是帶權路徑長度。樹的路徑長度 樹中每個結點的路徑長度之和。權 附加在樹節點上,表示出現的概率。樹的帶權路徑長度 所有葉子結點帶權長度之和。看例項 的結點路徑長度 從d到 a的路徑,共走了兩條邊,所以為2。樹中的葉子結點有 d,e和 f。結點...