• 二叉树叶子节点的霍夫曼编码


     1 #include<iostream>
     2 #include<list>
     3 
     4 using namespace std;
     5 
     6 typedef struct treenode
     7 {
     8     treenode* leftchild;
     9     treenode* rightchild;
    10     int data;
    11 }Treenode,*pTreenode;
    12 
    13 //遍历list<int>中的元素
    14 void printL(list<int> &l)
    15 {
    16     for(list<int>::iterator it=l.begin();it!=l.end();it++)
    17     {
    18         cout<<(*it);
    19     }
    20 }
    21 
    22 
    23 //对二叉树的每个叶子节点进行霍夫曼编码,将编码的结果存储在链表l中并打印出来,打印的叶子节点的顺序按照先序遍历的顺序。编码的原则是二叉树向左是0,向右是1
    24 void Huffmancode(pTreenode root,list<int> &l)
    25 {
    26     if(!root)
    27     {
    28         return;
    29     }
    30 
    31     if(!root->leftchild && !root->rightchild)
    32     {
    33         cout<<root->data<<":";
    34         printL(l);
    35         cout<<endl;
    36     }
    37 
    38     if(root->leftchild)
    39     {
    40         l.push_back(0);//将元素"0"压入栈的末端
    41         Huffmancode(root->leftchild,l);
    42         l.pop_back();//执行完递归函数的这一层,需要将其弹出,就只剩下上一层的根节点的编码了,这位为后面该根节点的右子树叶子节点编码扫清了障碍
    43     }
    44 
    45     if(root->rightchild)
    46     {
    47         l.push_back(1);//将元素"1"压入栈的末端
    48         Huffmancode(root->rightchild,l);
    49         l.pop_back();
    50     }
    51 }
    52 
    53  
    54 
    55 int main()
    56 {
    57     //建立一颗树
    58     Treenode t1,t2,t3,t4,t5,t6,t7;
    59     memset(&t1,0,sizeof(Treenode));
    60     memset(&t2,0,sizeof(Treenode));
    61     memset(&t3,0,sizeof(Treenode));
    62     memset(&t4,0,sizeof(Treenode));
    63     memset(&t5,0,sizeof(Treenode));
    64     memset(&t6,0,sizeof(Treenode));
    65     memset(&t7,0,sizeof(Treenode));
    66 
    67     t1.data=1;
    68     t2.data=2;
    69     t3.data=3;
    70     t4.data=4;
    71     t5.data=5;
    72     t6.data=6;
    73     t7.data=7;
    74 
    75     t1.leftchild=&t2;
    76     t1.rightchild=&t3;
    77     t2.leftchild=&t4;
    78     t2.rightchild=&t5;
    79     t3.rightchild=&t6;
    80     t4.leftchild=&t7;
    81     //霍夫曼编码
    82     list<int> L;
    83     Huffmancode(&t1,L);
    84 
    85     return 0;
    86 }
  • 相关阅读:
    如何在TVM上集成Codegen(上)
    CodeGen准备存储库
    CodeGen按钮循环
    CodeGen标记循环
    CodeGen结构循环回路
    CodeGen处理Synergy方法目录
    回顾6 单点登录
    回顾 five 幂等性
    回顾 four Object
    程序员的数学基础课 笔记6
  • 原文地址:https://www.cnblogs.com/jswu-ustc/p/7805634.html
Copyright © 2020-2023  润新知