首先我们先定义节点:
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