哈夫曼 编码

不错的解释

void HuffmanCode(Node *p, const int numLeafs, string *codes) {
	// p为节点数组的指针,codes为string数组的指针 
	// 用于存储每个节点的哈夫曼码

	// parent表示父节点位置
	int parent;

	// 每次对一个叶子节点进行编码
	// i表示当前叶子节点位置
	for (int i=0; i < numLeafs; i++) {

		// j表示当前节点位置,i是不能在下面循环中改变的
		// 使用j来记录节点的移动过程
		int j = i;

		// 当前节点的父节点位置
		parent = p[i].parent;

		// 从当前叶子节点p[i]开始,找到哈夫曼树的根节点
		// 循环结束条件是此时parent为0,即达到哈夫曼树的根节点
		while(parent != -1) {

			// 如果当前节点是父节点的左子树,则此分支编码为0
			if (p[parent].left == j) {
				codes[i].push_back('0');
			}

			// 如果当前节点是父节点的右子树,则编码为1
			else {
				codes[i].push_back('1');
			}
   
			j = parent;
			parent = p[j].parent;
		}
		cout << codes[i] << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_47991812/article/details/120813730