最优二叉树算法

简介:

练习做一下构造最优二叉树的算法,不过如何计算WPL呢?

本次未能实现,希望懂的人可以帮我解决一下这个问题,不胜感激!

//
// 头文件:HuffmanTree.h

//
// 叶子结点的最大数量
#define LEAVES_COUNT 4

//
// 二叉树的最大结点总数
#define NODES_COUNT (2 * LEAVES_COUNT - 1)

//
// 哈夫曼树的结点结构体
typedef struct tagHuffmanTreeNode
{
	float weight;  // 权值,假设权值都是大于零的值
	int parent;    // 指示双亲
	int lchild;    // 指示左孩子
	int rchild;    // 指示右孩子
}HuffmanNode;

//
// 哈夫曼树定义为二维数组
typedef HuffmanNode HuffmanTree[NODES_COUNT];


//
// 构造一棵哈夫曼树
void CreateHuffmanTree(HuffmanTree tree);

//
// 初始化
void InitHuffmanTree(HuffmanTree tree);

//
// 输入叶子的权值
void InputWeightsOfLeaves(HuffmanTree tree);

//
// 选择两个权最小的结点生成新的结点
void SelectMin(HuffmanTree tree, int maxValue, int *left, int *right);

//
// 计算哈夫曼树的最小带权路径长度之和
int ComputeWPL(HuffmanTree tree);

//
// 测试哈夫曼树的构造,译码
// HuffmanTree.c

#include <stdio.h>
#include <stdlib.h>

#include "HuffmanTree.h"

int main()
{

	HuffmanTree tree;

	// 构造哈夫曼树
	CreateHuffmanTree(tree);

	printf("WPL=%d\n", ComputeWPL(tree));

	return 0;
}

//
// 构造一棵哈夫曼树
void CreateHuffmanTree(HuffmanTree tree)
{
	int i;
	int left, right;
 
	InitHuffmanTree(tree);      // 初始化

	printf("输入%d个结点值:\n", LEAVES_COUNT);
	InputWeightsOfLeaves(tree); // 输入叶子权值至T[0..n-1]的weight域  

	// 共进行n-1次合并,新结点依次存于T[i]中  
    for (i = LEAVES_COUNT; i < NODES_COUNT; i++)
    {
		// 在tree中0~i-1中选择最小的两个根结点
		SelectMin(tree, i - 1, &left, &right);

		// 在i个结点作为新合成结点的双亲
		tree[left].parent = i;
		tree[right].parent = i;
		tree[i].lchild = left;  // 最小权的根结点是新结点的左孩子
		tree[i].rchild = right; // 次小权的根结点是新结点的右孩子 

		// 新结点的权值
		tree[i].weight = tree[left].weight + tree[right].weight;
    }

}


//
// 初始化
// 因为C语言数组的下界为0,故用-1表示空指针。树中某结点的lchild、rchild和parent不等于-1时,
// 它们分别是该结点的左、右孩子和双亲结点在向量中的下标。这里设置parent域有两个作用:其一是使查找
// 某结点的双亲变得简单;其二是可通过判定parent的值是否为-1来区分根与非根结点。
//  将T[0..m-1]中2n-1个结点里的三个指针均置为空(即置为-1),权值置为0。
void InitHuffmanTree(HuffmanTree tree)
{
	int i = 0;

	for (i = 0; i < NODES_COUNT; i++)
	{
		tree[i].lchild = -1;
		tree[i].rchild = -1;
		tree[i].parent = -1;
		tree[i].weight = 0;
	}
}

//
// 输入叶子的权值
// 读人n个叶子的权值存于向量的前n个分量(即T[0..n-1])中。它们是初始森林中n个孤立的根结点上的权值。
void InputWeightsOfLeaves(HuffmanTree tree)
{
     char ch;
	 int i;

	 for (i = 0; i < LEAVES_COUNT; i++)
	 {
		 scanf("%c", &tree[i].weight);
	 }
}

//
// 选择两个权最小的结点生成新的结点
void SelectMin(HuffmanTree tree, int maxValue, int *left, int *right)
{
	int i, j;
	int const MAX_VALUE = 10000;
    int m1, m2;

	for (i = 0; i < maxValue; i++)
	{
		m1 = m2 = MAX_VALUE;
		*left = 0;
		*right = 0;

		for (j = 0; j < LEAVES_COUNT + 1; j++)
		{
			if (tree[j].weight < m1 && tree[i].parent == -1) // 要求此结点还没有构造
			{
				m2 = m1; // 较大者给m2
				*right = *left;

				m1 = tree[j].weight; // 取较小者
				*left = j;
			}
			else if (tree[j].weight < m2 && tree[i].parent == -1)
			{
				m2 = tree[j].weight;
                *right = j;
			}
		}
	}
}

//
// 计算哈夫曼树的最小带权路径长度之和
int ComputeWPL(HuffmanTree tree)
{
	int i = 0;
	int wpl = 0;

    for (i = 0; i < NODES_COUNT; i++)
    {
         if (IsLeaf(tree[i]))
         {
			 wpl += tree[i].weight * (i + 1); // 这里不正确,该如何获取结点所有的层数呢?
         }
    }

	return wpl;
}

//
// 判断是否为叶子结点
int IsLeaf(HuffmanNode node)
{
    return node.lchild == -1 && node.rchild == -1;
}


目录
相关文章
|
11天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
43 5
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
67 5
|
2月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
52 0
|
7月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
51 0
|
7月前
|
存储 算法 Linux
【数据结构和算法】---二叉树(1)--树概念及结构
【数据结构和算法】---二叉树(1)--树概念及结构
62 0
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
33 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
3月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
40 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
3月前
|
存储 算法
【二叉树】—— 算法题
【二叉树】—— 算法题
【二叉树】—— 算法题
|
3月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
38 0

热门文章

最新文章