哈夫曼树又叫最优二叉树,指具有一组特定权值的叶子节点的具有最小带权路径长度的二叉树。
实现代码如下:
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![]()
5
namespace 哈夫曼树
6
{
7
class Program
8
{
9
public class Node
10
{
11
//节点权值
12
private int weight;
13
//左孩子
14
private int lChild;
15
//右孩子
16
private int rChild;
17
//父结点
18
private int parent;
19
//节点权值属性
20
public int Weight
21
{
22
get
23
{
24
return weight;
25
}
26
set
27
{
28
weight = value;
29
}
30
}
31
//左孩子节点属性
32
public int LChild
33
{
34
get
35
{
36
return lChild;
37
}
38
set
39
{
40
lChild = value;
41
}
42
}
43
//右孩子节点属性
44
public int RChild
45
{
46
get
47
{
48
return rChild;
49
}
50
set
51
{
52
rChild = value;
53
}
54
}
55
//父节点属性
56
public int Parent
57
{
58
get
59
{
60
return parent;
61
}
62
set
63
{
64
parent = value;
65
}
66
}
67![]()
68
//构造函数
69
public Node()
70
{
71
weight = 0;
72
lChild = -1;
73
rChild = -1;
74
parent = -1;
75
}
76
//构造函数
77
public Node(int w, int l, int r, int p)
78
{
79
weight = w;
80
lChild = l;
81
rChild = r;
82
parent = p;
83
}
84
85
}
86
//哈夫曼树类
87
public class HaffmanTree
88
{
89
//节点数目
90
private Node[] data;
91
//叶子节点数目
92
private int leafNum;
93
//索引器
94
public Node this[int index]
95
{
96
get
97
{
98
return data[index];
99
}
100
set
101
{
102
data[index] = value;
103
}
104
}
105
//叶子节点数目属性
106
public int LeafNum
107
{
108
get
109
{
110
return leafNum;
111
}
112
set
113
{
114
leafNum = value;
115
}
116
}
117
//构造函数
118
public HaffmanTree(int n)
119
{
120
data = new Node[2 * n - 1];
121
leafNum = n;
122
}
123
//创建哈夫曼树
124
public void CreateTree()
125
{
126
int max1, max2, tmp1, tmp2;
127
//输入N个叶子节点的权值
128
for (int i = 0; i < this.leafNum; i++)
129
{
130
data[i].Weight = Console.Read();
131
}
132
//处理N个叶子节点,建立哈夫曼树
133
for (int i = 0; i < this.leafNum - 1; i++)
134
{
135
136
max1 = max2 = Int32.MaxValue;
137
tmp1 = tmp2 = 0;
138
//在全部节点中找权值最小的两个节点
139
for (int j = 0; j < this.leafNum + i; ++j)
140
{
141
if ((data[j].Weight < max1) && (data[i].Parent == -1))
142
{
143
max2 = max1;
144
tmp2 = tmp1;
145
tmp1 = j;
146
max1 = data[j].Weight;
147
}
148
else if ((data[j].Weight < max2) && (data[i].Parent == -1))
149
{
150
max2 = data[j].Weight;
151
tmp2 = j;
152
}
153![]()
154
}
155![]()
156
data[tmp1].Parent = this.leafNum + i;
157
data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;
158
data[this.leafNum + i].LChild = tmp1;
159
Console.WriteLine(data[this.leafNum + i].LChild);
160
data[this.leafNum + i].RChild = tmp2;
161
Console.WriteLine(data[this.leafNum + i].RChild);
162![]()
163
}
164
}
165
}
166
static void Main(string[] args)
167
{
168![]()
169
HaffmanTree haffman = new HaffmanTree(5);
170
haffman.CreateTree();
171
}
172
}
173
}
174![]()
using System;2
using System.Collections.Generic;3
using System.Text;4

5
namespace 哈夫曼树6
{7
class Program8
{9
public class Node10
{ 11
//节点权值12
private int weight;13
//左孩子14
private int lChild;15
//右孩子16
private int rChild;17
//父结点18
private int parent;19
//节点权值属性20
public int Weight21
{22
get23
{24
return weight;25
}26
set27
{28
weight = value;29
}30
}31
//左孩子节点属性32
public int LChild33
{34
get35
{36
return lChild;37
}38
set39
{40
lChild = value;41
}42
}43
//右孩子节点属性44
public int RChild45
{46
get47
{48
return rChild;49
}50
set51
{52
rChild = value;53
}54
}55
//父节点属性56
public int Parent57
{58
get59
{60
return parent;61
}62
set63
{64
parent = value;65
}66
}67

68
//构造函数69
public Node()70
{71
weight = 0;72
lChild = -1;73
rChild = -1;74
parent = -1;75
}76
//构造函数77
public Node(int w, int l, int r, int p)78
{79
weight = w;80
lChild = l;81
rChild = r;82
parent = p;83
}84
85
}86
//哈夫曼树类87
public class HaffmanTree88
{89
//节点数目90
private Node[] data;91
//叶子节点数目92
private int leafNum;93
//索引器94
public Node this[int index]95
{96
get97
{98
return data[index];99
}100
set101
{102
data[index] = value;103
}104
}105
//叶子节点数目属性106
public int LeafNum107
{108
get109
{110
return leafNum;111
}112
set113
{114
leafNum = value;115
}116
}117
//构造函数118
public HaffmanTree(int n)119
{120
data = new Node[2 * n - 1];121
leafNum = n;122
}123
//创建哈夫曼树124
public void CreateTree()125
{126
int max1, max2, tmp1, tmp2;127
//输入N个叶子节点的权值128
for (int i = 0; i < this.leafNum; i++)129
{130
data[i].Weight = Console.Read();131
}132
//处理N个叶子节点,建立哈夫曼树133
for (int i = 0; i < this.leafNum - 1; i++)134
{135
136
max1 = max2 = Int32.MaxValue;137
tmp1 = tmp2 = 0;138
//在全部节点中找权值最小的两个节点139
for (int j = 0; j < this.leafNum + i; ++j)140
{141
if ((data[j].Weight < max1) && (data[i].Parent == -1))142
{143
max2 = max1;144
tmp2 = tmp1;145
tmp1 = j;146
max1 = data[j].Weight;147
}148
else if ((data[j].Weight < max2) && (data[i].Parent == -1))149
{150
max2 = data[j].Weight;151
tmp2 = j;152
}153

154
}155

156
data[tmp1].Parent = this.leafNum + i;157
data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;158
data[this.leafNum + i].LChild = tmp1;159
Console.WriteLine(data[this.leafNum + i].LChild);160
data[this.leafNum + i].RChild = tmp2;161
Console.WriteLine(data[this.leafNum + i].RChild);162

163
}164
}165
}166
static void Main(string[] args)167
{168

169
HaffmanTree haffman = new HaffmanTree(5);170
haffman.CreateTree();171
}172
}173
}174



浙公网安备 33010602011771号