(最小堆)哈夫曼樹 ->求結點值與權值積的和
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue< int, vector<int>, greater<int> >Q;//greater改為less即為由大到小排列
int main()
{
int n,x,ans;
while(scanf("%d",&n)!=EOF)
{
ans=0;
while(!Q.empty()) Q.pop();
for(int i=0;i<n;i++)
{
scanf("%d",&x);
Q.push(x);
}
while(Q.size()>1)
{
int a=Q.top();Q.pop();
int b=Q.top(); Q.pop();
ans+=a+b;
Q.push(a+b);
}
printf("%d\n",ans);
}
return 0;
}
相關推薦
(最小堆)哈夫曼樹 ->求結點值與權值積的和
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; priority_queue<
最小堆實現哈夫曼樹的構造及哈夫曼編碼、解碼
以下程式的演算法思想主要來自於浙江大學陳越老師主編的資料結構一書。最大堆(最小堆思想差不多)(之後會寫一篇部落格介紹),這裡主要講講哈夫曼樹的定義及實現。 Huffman Tree 相關概念: 結點的路徑長度:從根結點到該結點的路徑上分支的數
資料結構——哈夫曼樹求最小WPL(樹的帶權路徑長度)
給出程式碼與註釋 #include<queue> #include<iostream> using namespace std; //代表小堆頂的優先佇列 priority_queue<long long, vector<long long>, gre
資料結構(三):非線性邏輯結構-特殊的二叉樹結構:堆、哈夫曼樹、二叉搜尋樹、平衡二叉搜尋樹、紅黑樹、線索二叉樹
/* 性質1. 節點是紅色或黑色 性質2. 根是黑色 性質3. 每個紅色節點的兩個子節點都是黑色 (從每個葉子到根的所有路徑上不能有兩個連續的紅色節點) 性質4. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點 */ #include #include typedef enum
堆排序(最小堆)C++
堆分為大根堆(最大堆)和小根堆(最小堆),堆排序就是二叉堆的升級版,實際上是一棵完全二叉樹 不同的是這棵二叉樹裡每個節點保證父節點都小於孩子節點 最後進行堆排序,將堆頂最小的節點(第一個)與最後一個節點(最大的節點)進行交換,對剩下的進行調節,令其滿足最小堆 #incl
※資料結構※→☆非線性結構(tree)☆============哈夫曼樹 順序儲存結構(tree Huffman sequence)(二十二)
/** @(#)$Id: AL_TreeHuffmanSeq.h 70 2013-10-08 10:31:44Z xiaoting $ @brief Tree (tree) that contains n (n> 0) nodes of a finite set, where: (1) E
堆排序(最小堆)--【演算法導論】
堆排序的思想在堆排序(最大堆)已做說明,故不再贅述; 總之,思想就是首先進行建堆,由於這是最小堆,故而必須保證父節點都小於孩子節點,若不滿足條件,則進行調節; 最後進行堆排序,不斷將最小的提取出來,並對剩下的進行調節,使之滿足最小堆; 故而將最大堆中的判斷父節點與孩子大小部
7-5 堆中的路徑(最小堆)
將一系列給定數字插入一個初始為空的小頂堆H[]。隨後對任意給定的下標i,列印從H[i]到根結點的路徑。 輸入格式: 每組測試第1行包含2個正整數N和M(≤1000),分別是插入元素的個數、以及需要列印的路徑條數。下一行給出區間[-10000, 10000]內的N個要被插入一個初始為空的小頂堆
最大堆(最小堆)C++實現原始碼
寫在前面 最近漸漸愛上寫部落格,覺得每天學到的知識需要保鮮,寫的原始碼也能及時與大家分享,接下來進入正題。 最大堆(最小堆) 最大堆(最小堆)是非常重要的資料結構,公司面試時經常會被問到,在這裡,我不會詳細介紹它的原理,而是介紹它的適用場景以及兩種寫法
【高效能定時器】時間堆(最小堆)
最小堆及其應用:時間堆 一、 堆 1. 概念 堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於(或不小於)其左子節點和右子節點的值。 其中,兩個葉子節點的大小沒有順序。 堆又分為兩種,最大堆、最小堆。由上面的
資料結構實現之最小優先佇列(最小堆)
package xwq.dt; import java.util.Comparator; import java.util.Iterator; import java.util.NoSuchElementException; import xwq.util.
java 二叉樹(十三) 哈夫曼樹和哈夫曼編碼
一般可以按下面步驟構建: 1,將所有左,右子樹都為空的作為根節點。 2,在森林中選出兩棵根節點的權值最小的樹作為一棵新樹的左,右子樹,且置新樹的附加根節點的權值為其左,右子樹上根節點的權值之和。注意,左子樹的權值應小於右子樹的權值。 3,從森林中刪除這兩棵樹,同時把新樹加入
【SSLGZ 1408】(樹)哈夫曼樹(二)
問題描述 從a開始的n個字母分別表示n個結點,分別代n個權值,以它們為葉子結點構造一棵哈夫曼樹(若兩節點權值相等,按照字典排序構造),最後求該哈夫曼樹路徑長。 樣例輸入 7 a b c d e
資料結構 JAVA描述(五)哈夫曼樹,樹與森林
相關概念: 結點的帶權路徑長度: 該結點的路徑長度 × 該結點的權值 最優二叉樹(哈夫曼樹):給定n個權值並作為n個葉結點按一定規則構造的一棵二叉樹,使其帶權路徑長度達到最小值,則這棵二叉樹被稱為最優二叉樹。 字首編碼:在所有字元的編碼中,任何一個字
L2-012. 關於堆的判斷 (最小堆)
將一系列給定數字順序插入一個初始為空的小頂堆H[]。隨後判斷一系列相關命題是否為真。命題分下列幾種:“x is the root”:x是根結點;“x and y are siblings”:x和y是兄弟結點;“x is the parent of y”:x是y的父結點;“x is a child of y”:
哈夫曼樹的基本構建與操作
看到的講解huffman樹的一篇比較好懂的部落格 出處:http://blog.csdn.net/wtfmonking/article/details/17150499# 1、基本概念 a、路徑和路徑長度 若在一棵樹中存在著一個結點序列 k1,k2,……,kj, 使得 k
[C語言]哈夫曼樹(Huffman)的構造與實現
C語言資料結構中哈夫曼樹是個重要的內容。哈夫曼主要是它的編碼應用可以保證譯碼的非二義性。 每天堅持編寫一個程式,持之以恆,我們就會更加熟練的進行程式設計,從而為以後打下基礎。 下面是今天編寫的HUffman樹的原始碼,因為純手寫,沒有執行,瞭
隨手練——HDU Safe Or Unsafe (小根堆解決哈夫曼問題)
dex show () style 輸出 pre hello nbsp cin HDU 2527 :http://acm.hdu.edu.cn/showproblem.php?pid=2527 哈夫曼樹,學完就忘得差不多了,題目的意思都沒看懂,有時間復習下,看了別人的才知道
完成基於哈夫曼樹(最優二叉樹)的壓縮及解壓小程式的收穫
收穫 1) 更有條理的構造我的程式碼了: 先從main方法下手,將自己想要的實現程式的功能以註釋 的方式寫出來,然後再逐漸細化每一部分的功能,每部分的功能都有非常明確的輸入部分,將這些輸入的內容加工,進行輸出(也就是下一部分功能的實現的輸入部分)就是這部分功能
NO.9章 樹(遍歷、BST、AVL、並查集、堆、哈夫曼)
ack bst 路徑壓縮 層序遍歷 查找樹 哈夫曼樹 平衡 style 操作 1. 樹與二叉樹 1)定義性質 3)存儲 4)基本操作 2. 二叉樹的遍歷 1)先序 2)中序 3)後序 4)層序 5)二叉樹靜態實現 3. 樹的遍歷 1)二叉樹靜態實現 2)先根遍歷 3)