二叉樹的層次遍歷 哈夫曼樹及哈夫曼編碼的建立

2021-08-02 08:39:25 字數 2330 閱讀 6036

#include #include #define n 100        //葉子結點數

#define m 2*n-1 //樹中結點總數

#define maxn 0x7fffffff

typedef char elemtype;

typedef struct node

bitnode,*bitree;

typedef struct//哈夫曼樹的節點結構型別

htnode;

typedef struct//每個節點哈夫曼編碼的結構型別

hcode;

typedef struct node

node1,*linkqueuenode;

typedef struct

linkqueue;

bitree createbitree();//建立二叉樹

int leaf(bitree t);//分治法統計葉子節點數目

bool layerorder(bitree bt);//層次遍歷二叉樹

bool initqueue(linkqueue *q);//鏈佇列初始化

bool enterqueue(linkqueue *q,bitree x);//入隊,將資料元素x插入到佇列q中

bool deletequeue(linkqueue *q,bitree *x);//出隊,將佇列q的隊頭元素出隊並儲存到x所指的儲存空間中

bool isempty(linkqueue *q);//判斷鏈佇列是否為空

void preorder(bitree t);//先序

void inorder(bitree t);//中序

void postorder(bitree t);//後序

void createht(htnode ht,int n);//構造哈夫曼樹

void createhcode(htnode ht,hcode hcd,int n);//實現哈夫曼編碼

void disphcode(htnode ht,hcode hcd,int n);//輸出哈夫曼編碼

int main(void)

; double fnum[7]= ;

htnode ht[m];

hcode hcd[n];

for (int i=0; idata=x;

t->lchild=createbitree();

t->rchild=createbitree();

}return t;

}bool layerorder(bitree bt)//層次遍歷二叉樹

return true;

}bool initqueue(linkqueue *q)//鏈佇列初始化

else

return false;//溢位

}bool enterqueue(linkqueue *q,bitree x)//入隊,將資料元素x插入到佇列q中

else

return false;//溢位

}bool deletequeue(linkqueue *q,bitree *x)//出隊,將佇列q的隊頭元素出隊並儲存到x所指的儲存空間中

bool isempty(linkqueue *q)//判斷鏈佇列是否為空

int leaf(bitree t)//分治法統計葉子節點數目

void preorder(bitree t)//先序

}void inorder(bitree t)//中序

}void postorder(bitree t)//後序

}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++; //start指向哈夫曼編碼最開始字元

hcd[i]=hc;

}}void disphcode(htnode ht,hcode hcd,int n)//輸出哈夫曼編碼

m+=ht[i].weight;

sum+=ht[i].weight*j;

printf("\n");

}printf("\n 平均長度=%.2lf\n",1.0*sum/m);

}

哈夫曼樹及二叉樹

一 昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了 哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和 include priority queueq 這個是最大堆 最小堆這樣寫 priority queue,greater q 另外,用vs20...

哈夫曼樹及哈夫曼編碼

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

哈夫曼樹及哈夫曼編碼

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