Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e4558b0

Browse files
committed
Tree: add huffman tree.
1 parent 5fda961 commit e4558b0

File tree

12 files changed

+1302
-0
lines changed

12 files changed

+1302
-0
lines changed

source/tree/huffman/c/huffman.c

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
/**
2+
* Huffman树(C语言): C语言实现的Huffman树。
3+
*
4+
* 构造Huffman树时,使用到了最小堆。
5+
*
6+
* @author skywang
7+
* @date 2014/03/25
8+
*/
9+
10+
#include <stdio.h>
11+
#include <stdlib.h>
12+
#include "huffman.h"
13+
14+
// 创建最小堆
15+
extern void create_minheap(Type a[], int size);
16+
// 新建一个节点,并将最小堆中最小节点的数据复制给该节点。
17+
extern HuffmanNode* dump_from_minheap();
18+
// 将data插入到二叉堆中。0表示成功,-1表示失败。
19+
extern int dump_to_minheap(HuffmanNode *node);
20+
// 销毁最小堆
21+
extern void destroy_minheap();
22+
23+
/*
24+
* 前序遍历"Huffman树"
25+
*/
26+
void preorder_huffman(HuffmanTree tree)
27+
{
28+
if(tree != NULL)
29+
{
30+
printf("%d ", tree->key);
31+
preorder_huffman(tree->left);
32+
preorder_huffman(tree->right);
33+
}
34+
}
35+
36+
37+
/*
38+
* 中序遍历"Huffman树"
39+
*/
40+
void inorder_huffman(HuffmanTree tree)
41+
{
42+
if(tree != NULL)
43+
{
44+
inorder_huffman(tree->left);
45+
printf("%d ", tree->key);
46+
inorder_huffman(tree->right);
47+
}
48+
}
49+
50+
/*
51+
* 后序遍历"Huffman树"
52+
*/
53+
void postorder_huffman(HuffmanTree tree)
54+
{
55+
if(tree != NULL)
56+
{
57+
postorder_huffman(tree->left);
58+
postorder_huffman(tree->right);
59+
printf("%d ", tree->key);
60+
}
61+
}
62+
63+
/*
64+
* 创建Huffman树结点。
65+
*
66+
* 参数说明:
67+
* key 是键值。
68+
* left 是左孩子。
69+
* right 是右孩子。
70+
* parent 是父节点
71+
*/
72+
HuffmanNode* huffman_create_node(Type key, HuffmanNode *left, HuffmanNode* right, HuffmanNode* parent)
73+
{
74+
HuffmanNode* p;
75+
76+
if ((p = (HuffmanNode *)malloc(sizeof(HuffmanNode))) == NULL)
77+
return NULL;
78+
p->key = key;
79+
p->left = left;
80+
p->right = right;
81+
p->parent = parent;
82+
83+
return p;
84+
}
85+
86+
/*
87+
* 创建Huffman树
88+
*
89+
* 参数说明:
90+
* a 权值数组
91+
* size 数组大小
92+
*
93+
* 返回值:
94+
* Huffman树的根
95+
*/
96+
HuffmanNode* create_huffman(Type a[], int size)
97+
{
98+
int i;
99+
HuffmanNode *left, *right, *parent;
100+
101+
// 建立数组a对应的最小堆
102+
create_minheap(a, size);
103+
104+
for(i=0; i<size-1; i++)
105+
{
106+
left = dump_from_minheap(); // 最小节点是左孩子
107+
right = dump_from_minheap(); // 其次才是右孩子
108+
109+
// 新建parent节点,左右孩子分别是left/right;
110+
// parent的大小是左右孩子之和
111+
parent = huffman_create_node(left->key+right->key, left, right, NULL);
112+
left->parent = parent;
113+
right->parent = parent;
114+
115+
116+
// 将parent节点数据拷贝到"最小堆"中
117+
if (dump_to_minheap(parent)!=0)
118+
{
119+
printf("插入失败!\n结束程序\n");
120+
destroy_huffman(parent);
121+
parent = NULL;
122+
break;
123+
}
124+
}
125+
126+
// 销毁最小堆
127+
destroy_minheap();
128+
129+
return parent;
130+
}
131+
132+
/*
133+
* 销毁Huffman树
134+
*/
135+
void destroy_huffman(HuffmanTree tree)
136+
{
137+
if (tree==NULL)
138+
return ;
139+
140+
if (tree->left != NULL)
141+
destroy_huffman(tree->left);
142+
if (tree->right != NULL)
143+
destroy_huffman(tree->right);
144+
145+
free(tree);
146+
}
147+
148+
/*
149+
* 打印"Huffman树"
150+
*
151+
* tree -- Huffman树的节点
152+
* key -- 节点的键值
153+
* direction -- 0,表示该节点是根节点;
154+
* -1,表示该节点是它的父结点的左孩子;
155+
* 1,表示该节点是它的父结点的右孩子。
156+
*/
157+
void huffman_print(HuffmanTree tree, Type key, int direction)
158+
{
159+
if(tree != NULL)
160+
{
161+
if(direction==0) // tree是根节点
162+
printf("%2d is root\n", tree->key, key);
163+
else // tree是分支节点
164+
printf("%2d is %2d's %6s child\n", tree->key, key, direction==1?"right" : "left");
165+
166+
huffman_print(tree->left, tree->key, -1);
167+
huffman_print(tree->right,tree->key, 1);
168+
}
169+
}
170+
171+
void print_huffman(HuffmanTree tree)
172+
{
173+
if (tree!=NULL)
174+
huffman_print(tree, tree->key, 0);
175+
}

source/tree/huffman/c/huffman.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef _AVL_TREE_H_
2+
#define _AVL_TREE_H_
3+
4+
typedef int Type;
5+
6+
typedef struct _HuffmanNode{
7+
Type key; // 权值
8+
struct _HuffmanNode *left; // 左孩子
9+
struct _HuffmanNode *right; // 右孩子
10+
struct _HuffmanNode *parent; // 父节点
11+
}HuffmanNode, *HuffmanTree;
12+
13+
// 前序遍历"Huffman树"
14+
void preorder_huffman(HuffmanTree tree);
15+
// 中序遍历"Huffman树"
16+
void inorder_huffman(HuffmanTree tree);
17+
// 后序遍历"Huffman树"
18+
void postorder_huffman(HuffmanTree tree);
19+
20+
// 创建Huffman树
21+
HuffmanNode* create_huffman(Type arr[], int size);
22+
23+
// 销毁Huffman树
24+
void destroy_huffman(HuffmanTree tree);
25+
26+
// 打印Huffman树
27+
void print_huffman(HuffmanTree tree);
28+
29+
#endif
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* C 语言: Huffman树
3+
*
4+
* @author skywang
5+
* @date 2014/03/25
6+
*/
7+
#include <stdio.h>
8+
#include "huffman.h"
9+
10+
#define LENGTH(a) ( (sizeof(a)) / (sizeof(a[0])) )
11+
12+
void main()
13+
{
14+
int a[]= {5,6,8,7,15};
15+
int i,ilen=LENGTH(a);
16+
HuffmanTree root=NULL;
17+
18+
printf("== 添加数组: ");
19+
for(i=0; i<ilen; i++)
20+
printf("%d ", a[i]);
21+
22+
// 创建数组a对应的Huffman树
23+
root = create_huffman(a, ilen);
24+
25+
printf("\n== 前序遍历: ");
26+
preorder_huffman(root);
27+
28+
printf("\n== 中序遍历: ");
29+
inorder_huffman(root);
30+
31+
printf("\n== 后序遍历: ");
32+
postorder_huffman(root);
33+
printf("\n");
34+
35+
printf("== 树的详细信息: \n");
36+
print_huffman(root);
37+
38+
// 销毁二叉树
39+
destroy_huffman(root);
40+
}

0 commit comments

Comments
 (0)