pta 构造哈夫曼树-有序输入 优先队列做法
生活随笔
收集整理的這篇文章主要介紹了
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 构造哈夫曼树-有序输入 优先队列做法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 麻将的发牌与洗牌_JAVA程序
- 下一篇: Verilog -- 改进的Booth乘