#include <functional>
#include <ios>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
//声明树结构体
struct TreeNode{
int num;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : num(x), left(nullptr), right(nullptr){}
};
struct compare{
bool operator()(TreeNode* l, TreeNode* r){
if(l->num != r->num){
return l->num > r->num;//升序
}
else{
return (l->left == nullptr && l->right == nullptr) &&
(r->left != nullptr || r->right != nullptr);
//没孩子则排右边
}
}
};
void dfs(TreeNode* node){
//中序遍历
if(node->left) dfs(node->left);
cout << node->num << " ";
if(node->right) dfs(node->right);
}
int main() {
int n;
cin >> n;
cin.ignore();
string s;
getline(cin, s);
istringstream iss(s);
string temp;
vector<int> weights;
while(iss >> temp){
weights.push_back(stoi(temp));
}
priority_queue<TreeNode*,vector<TreeNode*>, compare> minHeap;//构建小根堆
//先将初始权重加入优先队列
for(int weight : weights){
minHeap.push(new TreeNode(weight));
}
//构造树的结构
while(minHeap.size()>1){
TreeNode* left = minHeap.top();minHeap.pop();
TreeNode* right = minHeap.top();minHeap.pop();
TreeNode* node = new TreeNode(left->num + right->num);
node->left = left;
node->right = right;
minHeap.push(node);//插入新的节点
}
//载入剩余节点
TreeNode* root = minHeap.top();
//重构左右子树的大小
dfs(root);
}
构造哈夫曼树(C++)
最新推荐文章于 2024-08-03 11:47:07 发布