父节点表示法求哈夫曼树WPL

6 篇文章 0 订阅
4 篇文章 0 订阅
#include<bits/stdc++.h>
using namespace std;

struct HTnode{
	int w; //weight
	int father; // father = -1 表示没有父节点 
	HTnode(int w,int fath = -1):w(w),father(fath){ };
};
struct Cmp{
	bool operator()(const HTnode* a, const HTnode* b){
		return a->w > b->w;
	}
};

 


vector<HTnode*> createHT(vector<int>& weights); //返回建好的 父节点表示法 的 哈夫曼树 
int getPathVal(vector<HTnode*>& HTnodes, int n);
int main(){
	
	vector<int>weights; int x;
	// given an array of num, representing the weight of each node.
	while(cin>>x){
		weights.push_back(x);
	}
	vector<HTnode*> HTnodes = createHT(weights);
	cout<<getWPL(HTnodes, weights.size())<<endl; //第二个参数表示有多少个叶子节点 
	
	return 0;
}
vector<HTnode*> createHT(vector<int>& weights){
	priority_queue<HTnode*,vector<HTnode*>,Cmp>pq; //小根堆,每次弹出最小权值节点 
	
	int n = weights.size();
	vector<HTnode*> HTnodes(2*n - 1); // n 个叶子节点,n-1个合并节点 [0..n-1]为叶子节点
	// 建 叶子节点
	for(int i=0;i<n;i++){
		HTnodes[i] = new HTnode(weights[i]);
		pq.push(HTnodes[i]);
	}

	//建 合并节点 
	for(int i=n;i<2*n-1;i++){ 
		HTnode *a, *b;
		a = pq.top(); pq.pop();
		b = pq.top(); pq.pop();
		HTnodes[i] = new HTnode(a->w + b->w);
		a->father = i; b->father = i;
		pq.push(HTnodes[i]);
	}
	return HTnodes;
}
int getWPL(vector<HTnode*>& HTnodes, int n){
	int ans = 0;
	for(int i=0;i<n;i++){ //收集 n 个叶子结点的WPL
		
		int val = HTnodes[i]->w; int cur = i;
		
		while(HTnodes[i]->father != -1){ //路径长,i向上到达树根	
			ans += val;
			i = HTnodes[i]->father;
		}
		
		i = cur; //恢复 i  
	}
	return ans;
}


  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾影林深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值