设为首页 加入收藏

TOP

一步一步写算法(之哈夫曼树 下) (二)
2014-11-23 23:55:16 来源: 作者: 【 】 浏览:47
Tags:步一步 算法
manNode[0]->symbol = 1;

huffmanNode[1]->parent = head;

huffmanNode[1]->symbol = 0;

memmove(&huffmanNode[0], &huffmanNode[2], sizeof(HUFFMAN_NODE*) * (length -2));

huffmanNode[length -2] = head;

length --;

}

return head;

} 上面的代码完整了写出了huffman树的创建过程,那么我们怎么知道符号的编码是多少呢?这其实不难,因为根节点都知道了,我们只要按照自下而上的顺序遍历节点就可以打印出编码,只不过编码是逆序的而已,

void print_code_for_str(HUFFMAN_NODE* pNode, HUFFMAN_NODE* head)

{

if(NULL == pNode || NULL == head)

return;

while(head != pNode){

printf("%d", pNode->symbol);

pNode = pNode->parent;

}

return;

}

void print_code_for_str(HUFFMAN_NODE* pNode, HUFFMAN_NODE* head)

{

if(NULL == pNode || NULL == head)

return;

while(head != pNode){

printf("%d", pNode->symbol);

pNode = pNode->parent;

}

return;

}

如果对代码本身还有怀疑,可以编译一个测试用例验证一下,

void test()

{

HUFFMAN_NODE* node1 = NULL;

HUFFMAN_NODE* node2 = NULL;

HUFFMAN_NODE* node3 = NULL;

HUFFMAN_NODE* node4 = NULL;

HUFFMAN_NODE* test[] = {node1 = create_new_node('a', 0.1),

node2 = create_new_node('b', 0.2),

node3 = create_new_node('c', 0.3),

node4 = create_new_node('d', 0.4),

};

HUFFMAN_NODE* head = create_huffman_tree(test, sizeof(test)/sizeof(HUFFMAN_NODE*));

print_code_for_str(node1, head);

print_code_for_str(node2, head);

print_code_for_str(node3, head);

print_code_for_str(node4, head);

}

void test()

{

HUFFMAN_NODE* node1 = NULL;

HUFFMAN_NODE* node2 = NULL;

HUFFMAN_NODE* node3 = NULL;

HUFFMAN_NODE* node4 = NULL;

HUFFMAN_NODE* test[] = {node1 = create_new_node('a', 0.1),

node2 = create_new_node('b', 0.2),

node3 = create_new_node('c', 0.3),

node4 = create_new_node('d', 0.4),

};

HUFFMAN_NODE* head = create_huffman_tree(test, sizeof(test)/sizeof(HUFFMAN_NODE*));

print_code_for_str(node1, head);

print_code_for_str(node2, head);

print_code_for_str(node3, head);

print_code_for_str(node4, head);

}

总结:

(1)哈夫曼树不复杂,如果手算可以成功,那么编程应该也没有什么问题

(2)复杂算法都是由小算法搭积木而成的,朋友们应该在基本算法上打下坚实的基础

(3)算法注意复用,这里就用到了原来讲到的通用算法内容

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一步一步写算法(之 回数) 下一篇处理超长位数的数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: