哈夫曼樹的構建及遍歷

2022-07-16 01:15:16 字數 2591 閱讀 9978

哈夫曼樹是一棵怎樣的樹呢,假如我們給出一堆資料"1,2,3,4,5"(資料對應的數字還代表這個數字出現的次數)來構建一顆二叉樹,怎樣一顆二叉樹才能使我們的查詢效率率最高呢,那就是哈夫曼樹了,在前面的「1,2,3,4,5」中,我們先選出兩個最小的,那就是「1,2」,然後1和2構建乙個結點。該結點為3,左右子樹為「1,2」,把該結點3放進去後,現在的資料就是「3,3,4,5」,然後我們再從這裡面選出兩個最小的--"3,3",加起來就是6,放進去後就是「6,4,5」,依次迴圈。

我們可以利用堆來實現,我們先把資料放入乙個最小堆,然後建立一顆樹結點,該樹的左子樹對於第乙個出堆的結點資料,右子樹等於第二個出堆的,該結點的值就為左右子樹的值加起來,然後再放進堆,然後又從堆裡面選出兩個最小的值的結點為左右子樹,依次這樣,直到最後乙個結點放進去,然後出堆。這樣一顆哈夫曼樹就構建成功了,為了方便我們看清楚它的樣子,也為了方便我加強前面佇列的印象,我就用了層次遍歷把這個哈夫曼樹遍歷了一遍,層次遍歷會運用到佇列的思想,先將第根結點進隊,然後輸出,再將他的左右子樹進隊,然後出隊,(反正就是每齣一次隊,我們就要將這個結點的左右子樹存入進去)。這樣直到隊列為空。

#include

#include

typedef struct huf huf,*huftree;//哈夫曼樹的結構體。

typedef struct heap heap,*hnode;//堆的結構體。

typedef struct queue queue,*qnode;//佇列的結構體。

void initheap (hnode *h);//初始化堆。

void inserttoheap (hnode h,huf *t);//插入堆。

huftree deleteheap (hnode h);//出堆。

int isfullheap (hnode h);//判斷堆是否為滿。

int isemptyheap (hnode h);//判斷堆是否為空。

huftree createhuftree (int n);//建立乙個n個資料的乙個哈夫曼樹。

void initqueue (qnode *q);//初始化佇列。

void insertqueue (qnode q,huf *t);//進隊。

huftree deletequeue (qnode q);//出隊。

int isfullqueue (qnode q);//判斷隊是否為滿。

int isemptyqueue (qnode q);//判斷隊是否為空。

void leveltree (huftree t);//層次遍歷樹。

int main ()

void leveltree (huftree t)

}void initqueue (qnode *q)

int isfullqueue (qnode q)

int isemptyqueue (qnode q)

void insertqueue (qnode q,huf *t)

q->data[q->rear] = *t;

q->rear = (q->rear + 1) % (q->maxsize);

}huftree deletequeue (qnode q)

huf *temp;

temp = malloc(sizeof(huf));

*temp = q->data[q->front];

q->front = (q->front+1) % (q->maxsize);

return temp;

}huftree createhuftree (int n)

huftree tree;

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

tree = deleteheap(h);

return tree;

}void initheap (hnode *h)

int isfullheap (hnode h)

int isemptyheap (hnode h)

void inserttoheap (hnode h, huf *t)

h->size++;

int i = h->size;

while (h->data[i/2].weight > t->weight)

h->data[i] = *t;

}huftree deleteheap (hnode h)

huf *min;

min = malloc(sizeof(huf));

*min = h->data[1];

huf *temp;

temp = malloc(sizeof(huf));

*temp = h->data[h->size];

h->size--;

int parent,child;

for(parent = 1;parent * 2 <= h->size;parent = child)

if (temp->weight <= h->data[child].weight) break;

else h->data[parent] = h->data[child];

}h->data[parent] = *temp;

return min;

}

哈夫曼樹的構建

給定n個權值作為n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。n個權值分別設為 w1 w2 wn,則哈夫曼樹的...

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...

哈夫曼樹及哈夫曼編碼

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...