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

 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 }
原文地址:https://www.cnblogs.com/jswu-ustc/p/7805634.html