#include<bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;
;
map<char,string> mp;
map<string,char> pm;
struct pos
{
     char x;
     int num;
     pos *father=NULL;
     pos *lson=NULL;
     pos *rson=NULL;
     pos *p=NULL;
     friend bool operator < (pos a, pos b)
     {
        return a.num > b.num;    //重载小于号使得小的先出队列
     }
}tree[maxn];

void make_DFS(pos &root,string ss)
{
    if(root.lson==NULL && root.rson==NULL)
    {
        //cout<<root.x<<endl;
        mp[root.x]=ss;
        pm[ss]=root.x;
    }
    else
    {
        make_DFS(*root.lson,ss+");
        make_DFS(*root.rson,ss+");
    }
}
void build_tree(pos &root)
{
    priority_queue<pos> qu;  //  pos 结构体
    ;i<=;i++)
    {
        qu.push(tree[i]);
    }
    while(!qu.empty())
    {
        pos *qq;
        qq=qu.top().p;
        qu.pop();
        pos *pp;
        pp=qu.top().p;
        qu.pop();
       )
       {
           root.lson=pp;
           root.rson=qq;
           break;
       }
        (*pp).father=new pos;
        pos *x=(*pp).father;
        (*x).lson=pp;
        (*x).rson=qq;
        (*x).x='*';
        (*x).num=(*pp).num+(*qq).num;
        //cout<<(*x).num<<endl;
        (*x).p=&(*x);

        qu.push(*x);
    }
    //cout<<"make tree   OK"<<endl;
    make_DFS(root,"");
}
int32_t main()
{
            freopen("tree.txt","r",stdin);
            tree[].x=' ';
            ;i<=;i++)  cin>>tree[i].x;
            ;i<=;i++)  cin>>tree[i].num;
            ;i<=;i++)  tree[i].p=&tree[i];
            pos root;
            build_tree(root);
            ;i<=;i++)
            {
                 cout<<tree[i].x<<"   "<<tree[i].num<<"   "<<mp[tree[i].x]<<"   "<<pm[mp[tree[i].x]]<<endl;
            }
            ];
            getchar();gets(a);  cout<<a<<endl;   int l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);
            cout<<;i<l;i++)cout<<mp[a[i]];cout<<endl;
            cout<<"----------------------------------------"<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;  string ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;
            gets(a);  cout<<a<<endl;    l=strlen(a);  cout<<"译码"<<endl;   ss="";
            ;i<l;i++)
            {
                ss=ss+a[i];
                if(pm[ss]==' '|| (pm[ss]>='A'&&pm[ss]<='Z'))
                {
                    cout<<pm[ss];   ss="";
                }
            }cout<<endl;

}

C++ 作业(哈夫曼树)的更多相关文章

  1. 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

    本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

  2. (哈夫曼树)HuffmanTree的java实现

    参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...

  3. 数据结构之C语言实现哈夫曼树

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i<j),则称此结点序列是从 k1 到 kj 的路径. 从 ...

  4. C++哈夫曼树编码和译码的实现

    一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...

  5. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. 哈夫曼树---POJ3253

    http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出 ...

  7. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  8. 哈夫曼树(二)之 C++详解

    上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

  9. 哈夫曼树(一)之 C语言详解

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  10. 51nod 1117 聪明的木匠 (哈夫曼树)

    题目:传送门. 题意:中文题. 题解:就是构造一颗哈夫曼树,数据结构里的知识. #include <iostream> #include <cstdio> #include & ...

随机推荐

  1. Uboot启动流程分析(转载)

    最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移植到单位设计的ARMv7的处理器上.正好元旦放假三天闲来无事,有段完整的时间来整理下最近的工作成果.之前在学习uboot时 ...

  2. python 学习 面向对象编程

    面向对象编程---oop,是一种编程思想,oop把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行为了简化程序设计 ...

  3. JXL生成Excel,并提供下载(2:提供下载)

    实现效果: 项目中使用JXL生成Excel,使生成的Excel可以让用户下载,如下图 一.生成Excel 二.提供下载 实现思路: 1.页面使用form表单提交方式(Ajax提交方式,我这里不行) 2 ...

  4. asp.net MVC之Action过滤器浅析

    在asp.net MVC中,Action过滤器是一大利器,它可以在以下两个步骤执行相关的代码: 1.执行Action方法之前:OnActionExecuting 2.Action方法执行完毕后:OnA ...

  5. Python3.7.0的安装方法

    安装Python3.7.0 1.下载Python-3.7.0.tar.xz包安装 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.t ...

  6. (Java学习笔记) Java Threading (Java线程)

    Java Threading (Java线程) ● Process & Thread Processes are the abstraction of running programs: A ...

  7. 第三节 java 数组

    一维数组: 同一种类型数据的集合,其实数组就是一个容器. 好处: 可以自动给数组中的元素从0开始编号,方便操作这些元素. 格式1: 元素类型[]  数组名 = new 元素类型 [元素个数或者元素长度 ...

  8. 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(三)

    MyEclipse限时秒杀!活动火热开启中>> [MyEclipse最新版下载] 三.配置XDoclet支持的项目 默认情况下,MyEclipse EJB项目未配置使用XDoclet功能. ...

  9. JavaWeb:脚本标识

    脚本标识 一.JSP表达式 1.介绍 用于向页面中输出信息 2.语法格式 <%= 表达式%> 3.注意 在"<%"和"="之间不允许有空格,但 ...

  10. C# string 与 String的区别

    C# string 与 String的区别 The string type represents a string of Unicode characters. string is an alias ...