Huffman树

huffman树是一颗自平衡二叉树,且是一颗带权路长度最小的树。

huffman树的算法思想:找到权重最小与次小的两个节点,如果这两个点不在同一颗树中,将这两个节点连接成一颗树,再将这颗树的父节点值赋值为两子节点的加和,再放入原先的点中(原点集中的两个最小节点删去),再次比较找到最小的两个节点,重复该操作即可。

如节点{1,3,5,7},第一图权重为(1+3+5+7)*2=32,第二个图为huffman树,权重为7*1+5*2+4*3=29

Huffman树_第1张图片

Huffman树_第2张图片

#include 
#include 
#include 

using namespace std;

struct hfmTree{
	float weight;
//	hfmTree* parent;
	hfmTree* left;
	hfmTree* right;
	bool isleaf;
}; 
class huffmanTree{
public:
	hfmTree* head=NULL;
	vector t;//&t
	void inithufTree(vector w);//初始化huffman树 
	float outputWeight();//输出最优权重 
};
void huffmanTree::inithufTree(vector w){
	int num_leaf=w.size();
	int num_node=2*num_leaf-1;//总节点数
	for(int i=0;i s;
	hfmTree* temp=new hfmTree;
	
	if(head==NULL)head=temp;
	else temp=head;
	
	int index=0;

	while(temp||!s.empty()){
		while(temp){
			++index;
			s.push(temp);
			if(temp->left==NULL){
				weightAll+=index*temp->weight;
				++index;
			//if语句执行后就跳出该级while循环,转入处理右儿子 
			}
			temp=temp->left;
		}
		
		if(!s.empty()){
			temp=s.top();
			s.pop();
			--index;
			if(temp->right==NULL){
				weightAll+=index*temp->weight;
			}
			temp=temp->right;
		}
	}
	return weightAll;
}

 

你可能感兴趣的:(数据结构与算法)