日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pta 构造哈夫曼树-有序输入 优先队列做法

發布時間:2024/3/7 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pta 构造哈夫曼树-有序输入 优先队列做法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

pta 構造哈夫曼樹-有序輸入 優先隊列做法

構造哈夫曼樹,然后輸出它樹的中序序列。

從小到大的順序給出詞頻(不超過10個),根據詞頻構造哈夫曼樹。

為確保構建的哈夫曼樹唯一,本題做如下限定:

(1)選擇根結點權值最小的兩棵二叉樹時,選取權值較小者作為左子樹。

(2)若多棵二叉樹根結點權值相等,按先后次序分左右,先出現的作為左子樹,后出現的作為右子樹。

輸入格式:
第一行輸入詞頻個數; 第二行按從小到大的順序輸入每個詞頻。

輸出格式:
輸出中序序列,中間以一個空格隔開。

輸入樣例:

3
1 1 2

輸出樣例:

2 4 1 2 1

思路:
1. 建立一個元素是二叉樹結點的優先隊列,要求權重小的在前。
2. 將輸入的元素入隊列。
3. 反復取出前兩個結點,組成新結點,然后入隊列,直到隊列為空。此時隊列的最后一個結點就是哈夫曼二叉樹的根結點。
4. 中序遍歷二叉樹。

其中1 2 3步是用優先隊列創造哈夫曼二叉樹的步驟,還是比較重要的。

完整代碼:

#include <iostream> #include <queue> using namespace std;typedef struct Haffm {int priority;//權重Haffm* lchild;Haffm* rchild; }Haffmtree;void midorder(Haffmtree*& root) {//中序遍歷打印結果if (root==NULL)return;midorder(root->lchild);cout << root->priority <<" ";midorder(root->rchild); } struct myCompare {//比較函數,小的在前bool operator()(Haffmtree*& a, Haffmtree*& b) {return a->priority > b->priority;} };Haffmtree* buildHaffmtree(priority_queue<Haffmtree*, vector<Haffmtree*>, myCompare>& haffm) {do {Haffmtree* first = haffm.top();haffm.pop();if (haffm.empty()) {return first;}//哈夫曼數已經完成排序,first是根結點Haffmtree* root = new Haffmtree;root->lchild = first;root->rchild = haffm.top();haffm.pop();root->priority = root->lchild->priority + root->rchild->priority;//根結點權重是左右子樹權重之和。haffm.push(root);//將根結點入隊列} while (!haffm.empty()); } int main() {priority_queue<Haffmtree*, vector<Haffmtree*>, myCompare> haffm;int n;cin >> n;while (n--) {Haffmtree* node = new Haffmtree;cin >> node->priority;node->lchild = node->rchild = nullptr;haffm.push(node);}Haffmtree* root = buildHaffmtree(haffm);midorder(root);return 0; }

總結

以上是生活随笔為你收集整理的pta 构造哈夫曼树-有序输入 优先队列做法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。