哈夫曼树的构建【堆优化】

首先我们先定义节点:

class TreeNode {
public:
	int Cost;
	TreeNode* Left, *Right;
	TreeNode(int Cost = 0) {
		this->Cost = Cost;
		Left = Right = nullptr;
	}
};

然后写一个合并函数:

TreeNode* MegerNode(TreeNode* Node1,TreeNode* Node2){
	TreeNode* New=new TreeNode();
	New->Cost = Node1->Cost + Node2->Cost;
	if (Node1->Cost > Node2->Cost) {
		New->Left = Node1;
		New->Right = Node2;
	}
	else {
		New->Left = Node2;
		New->Right = Node1;
	}
	return New;
}

这个函数我们输入两个根节点,返回一个新的根节点,这个新的根节点的左右子树是我们输入的两个根节点;

然后是创建哈夫曼树的代码:

struct Cmp {
	bool operator()(TreeNode* A, TreeNode* B) {
		return A->Cost > B->Cost;
	}
};

class CreatHuffmanTree {

public:
	static::TreeNode* CreateTree(std::vector<int>& p) {
		if (p.size() == 1) return nullptr;

		std::priority_queue<TreeNode*, vector<TreeNode*>, Cmp> que;

		for (int i = 0; i < p.size(); i++) {
			que.push(new TreeNode(p[i]));
		}

		while (que.size() != 1) {
			TreeNode* Node1, *Node2;
			Node1 = que.top();
			que.pop();
			Node2 = que.top();
			que.pop();
			TreeNode* New = MegerNode(Node1, Node2);
			que.push(New);
		}
		return que.top();
	}
};

我们按照一下逻辑即可:

1:现搜索队列有n颗子树,我们寻找到WPL最小和次小的两个树,并将两棵树pop出搜索队列

2:将找到的两颗树合并为一颗新的树,新的树的WPL值为两颗树WPL的和;

3:将新树放到搜索队列中,更新n为n-1

        * n-1==1,那么返回搜索队列中的树,该树就是计算结果

        * n-1 !=1,进入1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值