zoukankan      html  css  js  c++  java
  • 哈夫曼树和哈弗曼编码小记

    原本是数据结构课的作业……到后来没查,放着占内存,删了有点浪费,干脆扔在博客上吧……

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<queue>
     4 #include<vector>
     5 #include<stack>
     6 #define maxn 10000+5
     7 using namespace std;
     8 
     9 int n;
    10 struct Node{
    11     int num;//节点编号 
    12     int lchild,rchild,parent;//节点的父节点、左子节点、右子节点 
    13     char c;
    14     int freq;//字母出现的频率 
    15     bool operator<(const Node &oth)const
    16     {
    17         return freq>oth.freq;
    18     }//重定义小于号运算符,使得结构体之间可以进行大小比较 
    19 }node[maxn];
    20 
    21 int main()
    22 {
    23     while(scanf("%d",&n)!=EOF)
    24     {
    25         priority_queue<Node> q;
    26         for(int i=1;i<=n;i++)//输入
    27         {
    28             cin>>node[i].c>>node[i].freq;
    29             node[i].num=i;
    30             node[i].lchild=0;
    31             node[i].rchild=0;
    32             node[i].parent=0;
    33             q.push(node[i]);
    34         }
    35         for(int i=n+1;i<=2*n-1;i++)//建树 
    36         {
    37             Node x,y;
    38             x=q.top(); q.pop();
    39             y=q.top(); q.pop();
    40             
    41             node[x.num].parent=i;
    42             node[y.num].parent=i; 
    43             
    44             node[i].num=i;
    45             node[i].lchild=x.num;
    46             node[i].rchild=y.num;
    47             node[i].parent=0;
    48             node[i].freq=x.freq+y.freq;
    49             node[i].c='';
    50             
    51             q.push(node[i]);
    52         }
    53         printf("哈夫曼树:
    "); 
    54         for(int i=1;i<=2*n-1;i++)
    55         {
    56             printf("node %d: p=%d 	 lc=%d 	 rc=%d 	 c=%c 	 freq=%d
    ",node[i].num,node[i].parent,node[i].lchild,node[i].rchild,node[i].c,node[i].freq);
    57         }
    58         printf("哈夫曼编码:
    "); 
    59         for(int i=1;i<=n;i++)//输出 
    60         {
    61             stack<bool> output;
    62             Node now=node[i];
    63             while(now.parent!=0)
    64             {
    65                 if(now.num == node[now.parent].lchild)//当前节点是其父节点的左子节点 
    66                     output.push(0);
    67                 else                                //当前节点是其父节点的右子节点
    68                     output.push(1);
    69                 now=node[now.parent];
    70             }
    71             printf("%c : ",node[i].c);
    72             while(!output.empty())
    73             {
    74                 printf("%d",output.top());
    75                 output.pop();
    76             }
    77             printf("
    ");
    78         } 
    79     }
    80 }
    81 
    82 /*
    83 测试数据:
    84 6
    85 f 5
    86 e 9
    87 c 12
    88 b 13
    89 d 16
    90 a 45
    91 */ 
  • 相关阅读:
    预备作业03 20162311张之睿
    [LeetCode 题解]: String to Interger (atoi)
    [LeetCode 题解]: Add Two Numbers
    [LeetCode 题解]: Interger to Roman
    [LeetCode 题解]: Longest Substring Without Repeating Characters
    [LeetCode 题解]: Roman to Interger
    [LeetCode 题解]: palindromes
    [LeetCode 题解]: Two Sum
    [LeetCode 题解]: Maximum Subarray
    [LeetCode 题解]:Gas Station
  • 原文地址:https://www.cnblogs.com/dilthey/p/6811484.html
Copyright © 2011-2022 走看看