哈夫曼树的构造

#include<iostream>
#include<string>
using namespace std;
struct ElemType
{
    char date;
    int weight;
}; 

struct HTNode
{
    char data;
    int weight;
    int parent,lchild,rchild;
    string code;
};

HTNode *createTree(ElemType *w,int n)//哈夫曼树构造
{
    HTNode *ht=new HTNode[2*n];
    int i,p1,p2;
    for(i=1;i<n;i++)//叶子节点初始化
    {
       ht[i].data=w[i].date;
       ht[i].weight=w[i].weight;
       ht[i].parent=ht[i].lchild=ht[i].rchild=0;
    }

    for(i=n+1;i<2*n;i++)//非叶子节点初始化
    {
        ht[i].weight=ht[i].parent=ht[i].lchild=ht[i].rchild=0;

    }

    for(i=n+1;i<2*n;i++)
    {
        Select(ht,1,i,p1,p2);//选中权重最小的两个
        ht[p1].parent=ht[p2].parent=i;
        ht[i].lchild=p1;
        ht[i].rchild=p2;
        ht[i].weight=ht[p1].weight+ht[p2].weight;
    }
    return ht;
}

void CreateCode(HTNode *ht,int n)
{
    ht[2*n-1].code="";
    for(int i=2*n-1;i>n;i--)
    {
        int left=ht[i].lchild;
        int right=ht[i].rchild;

        ht[left].code=ht[i].code+"0";
        ht[right].code=ht[i].code+"1";

    }
}

int main()
{

}

原文地址:https://www.cnblogs.com/ilovetheworld/p/10734845.html

时间: 2024-09-30 14:41:53

哈夫曼树的构造的相关文章

转载:哈夫曼树的构造和哈夫曼编码(C++代码实现)

作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h> #define MAX 100 #define MAXVALUE 500 typedef struct { int weight; int parent,lchild,rchild; }node; /*哈夫曼树结点类型*/ /*-----------------------------以下部分定义哈夫曼编码存储结构--

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的

哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 术语: i)路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径. 路径中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. ii)结点的权及带权路径长度 若对树中的每个结点赋给一个有着某种含义的数值,则这个数值称为该结点的权. 结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积. iii)树的带权路径长度 树的带权路径长度:所有叶子结点的带权路径长度之和,记为WPL. 先了解一下

《数据结构复习笔记》--哈夫曼树,哈夫曼编码

先来了解一下哈夫曼树. 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值 wk,从根结点到每个叶子结点的长度为 lk,则每个叶子结点的带权路径长度之和就是: 最优二叉树或哈夫曼树: WPL最小的二叉树. [例]有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树. 其中结果wpl最小值的是:33=(1+2)*3+(3)*2+(4+5)*2: 哈夫曼树的构造: 每次把权值最小的两棵二叉树合并, 代码: typedef struct Tr

[转]哈夫曼树

  一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率.例如,编制一个程序,将百分制转换成五个等级输出.大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: if(score<60) cout<<"Bad"<<endl; else if(score<70) cout<<"Pass"

哈夫曼树学习

基本概念: 1.路径是指从一个节点到另一个节点之间的分支序列,路径长度是指从一个节点到另一个节点所经过的分支数目. 2.实际生活中,我们为每一个节点赋予实际的意义的实数,称该实数为节点的权.在树形结构中把树根到某一节点的路径长度与该节点的权乘积叫该节点的带权路径长度. 3.树的带权路径长度是树中所有叶子节点的带权路径长度之和.                                  举例说明一下:c的权重分别为7,5,2,4.路径长度为层数-1即到根节点的长度 哈夫曼树: 哈夫曼树又叫

聪明的木匠 (哈夫曼树)

假设有n个权值,则构造出的哈夫曼树有n个叶子结点. n个权值分别设为 w1.w2.….wn,则哈夫曼树的构造规则为[1]: (1) 将w1.w2.…,wn看成是有n 棵树的森林(每棵树仅有一个结点): (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左.右子树,且新树的根结点权值为其左.右子树根结点权值之和: (3)从森林中删除选取的两棵树,并将新树加入森林: (4)重复(2).(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树. 51nod 1117 #include

哈夫曼树讲解

  一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树:         在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率.例如,编制一个程序,将百分制转换成五个等级输出.大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plaincopyprint? if(score<60) cout<<"Bad"<<endl; else if(score<70)

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int