数据结构---哈夫曼树与哈夫曼编码

// ConsoleApplication11.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
//哈夫曼树类HuffmanTree的定义
/*Huffman树结点类TreeNode声明*/
template<class T>
class HuffmanNode
{
private:
	HuffmanNode<T>* LLINK;//指向左右孩子的指针
	HuffmanNode<T>* RLINK;
	T INFO;//数据域
	int weight;//权值
public:
	HuffmanNode() {}//构造函数
	HuffmanNode<T>* GetLeft(void)const { return LLINK; }
	void SetLeft(HuffmanNode<T>*L) { LLINK = L; }
	HuffmanNode<T>*GetRight(void)const { return RLINK; }
	void SetRight(HuffmanNode<T> *R) { RLINK = R; }
	T& GetData() { return INFO; }
	void SetData(const T& item) { INFO = item; }
	int GetWeight() { return weight; }//返回weight域
	void SetWeight(const int w) { weight = w; }//将weight域更新为w

};
/*Huffman树类HuffmanTree声明*/
template<class T>
class HuffmanTree
{
private:
	int m;//Huffman树结点个数
	HuffmanNode<T> *H;//Huffman树结点的数组
public:
	HuffmanTree() { m = 0;H = NULL; }//构造函数
	void CreatHuffanTree(T data[], int weight[], int n);//创建哈夫曼树
	//其他操作
	HuffmanNode<T> *GetRoot() { return m == 0 ? NULL : H[m]; }
	void PreOrder(HuffmanNode<T>*t)const;
	void InOrder(HuffmanNode<T>*t)const;

};
//创建Huffman树
template<class T>
void HuffmanTree<T>::CreatHuffanTree(T data[], int weight[], int n)
{
	m = n;
	H = new HuffmanNode<T> *[m + 1];
	HuffmanNode<T> *p1, *p2, *p, *t;
	int i, j;
	for (i = 1;i <= m;i++)
	{
		H[i] = new HuffmanNode<T>();
		H[i]->SetDate(data[i]);
		H[i]->SetWeight(weight[i]);
		H[i]->SetLeft(NULL);
		H[i]->SetRight(NULL);
	}
	for (i = 1;i < m;i++)
	{
		t = new HuffmanNode<T>();
		p1 = H[i];
		p2 = H[i + 1];
		t->SetWeight(p1->GetWeight() + p2->GetWeight());
		t->SetLeft(p1);
		t->SetRight(p2);
		p = t;
		j = i + 2;
		while (j <= m && (p->GetWeight()) > (H[j]->GetWeight()))
		{
			H[j - 1] = H[j];
			j = j + 1;
		}
		H[j - 1] = p;
	}
}
int main()
{
    std::cout << "Hello World!\n"; 
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门提示: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

1.用堆操作

typedef struct TreeNode *HuffmanTree;
struct TreeNode
{
	int Weight;
	HuffmanTree Left,Right;
}
HuffmanTree Huffman(MinHeap H)
{
	/* 假设H->Size个权值已经存在H->Elements[]->Weight里*/
	int i;
	HuffmanTree T;
	BuildMinHeap(H);/*将H->Elements[]按权值调整为最小堆*/
	for(i=1;i<H->Size;i++)
	{
		T=malloc(sizeof(struct TreeNode));
		/*建立新结点*?
		T->Left=DeleteMin(H);
		/*从最小堆中删除一个结点,作为新T的左子结点*/
		T->Right=DeleteMin(H);
		/*从最小堆中删除一个结点,作为新T的右子结点*/
		T->Weight=T->Left->Weight+T->right->Weight;
		Insert(H,T);
	}
	T=DeleteMin(H);
	return T;
}

2.给定字符串,对字符串编码,使得该字符串的编码存储空间最少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不停---

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

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

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

打赏作者

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

抵扣说明:

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

余额充值