哈夫曼树又叫最优二叉树,指具有一组特定权值的叶子节点的具有最小带权路径长度的二叉树。
实现代码如下:
1using System;
2using System.Collections.Generic;
3using System.Text;
4
5namespace 哈夫曼树
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
2using System.Collections.Generic;
3using System.Text;
4
5namespace 哈夫曼树
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