文档详情

数据结构课程教程第六章.ppt

发布:2017-12-17约2.33万字共149页下载文档
文本预览下载声明
建立二叉树的存储结构 不同的定义方法相应有不同的存储结构的建立算法 { BiTNode *p; SqStack s; InitStack(s); if(T){p=T; do{ Visit(p-data); Push(s,p); if(p-lchild) p=p-lchild; else do { Pop(s,p); p=p-rchild; } while(!p!StackEmpty(s)); }while(!StackEmpty(s)||p); } } 6.5 线索二叉树 何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表? 5.线索二叉树的存储结构 (1).结点结构: 6.8 哈 夫 曼 树 与 哈 夫 曼 编 码 最优树的定义 如何构造最优树 前缀编码 最小冗余码/哈夫曼码 ● ASCII码/定长码 ab12:0110001000110010 97 98 49 50 ● 哈夫曼码/不定长码 能按字符的使用频度,使文本代码的总长度具有最小值。 例. 给定有18个字符组成的文本: A A D A T A R A E F R T A A F T E R 求各字符的哈夫曼码。 (1) 统计: (2) 构造Huffman树: (2) 构造Huffman树: (2) 构造Huffman树: (3) 在左分枝标0,右分枝标1: 如何译码? void HuffmanCoding(HuffmanTree HT, HuffmanCode HC, int *w, int n) { // 算法6.12, w存放 n个字符的权值(均0),构造哈夫曼树HT, 并求出n个字符的哈夫曼编码HC int i, j, m, s1,s2; char *cd; int p; int cdlen; if (n=1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); for (i=1; i=n; i++) { //初始化 HT[i].weight=w[i-1]; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for (i=n+1; i=m; i++) { //初始化 HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } printf(\n哈夫曼树的构造过程如下所示:\n); printf(HT初态:\n 结点 weight parent lchild rchild); for (i=1; i=m; i++) printf(\n%4d%8d%8d%8d%8d,i,HT[i].weight, HT[i].parent,HT[i].lchild, HT[i].rchild); printf( 按任意键,继续 ...); getch(); for (i=n+1; i=m; i++) { // 建哈夫曼树 在HT[1..i-1]中选择parent为0且weight最小的两个结点, 其序号分别为s1和s2。 Select(HT, i-1, s1, s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; printf(\nselect: s1=%d s2=%d\n, s1, s2); printf( 结点 weight parent lchild rchild); for (j=1; j=i; j++) printf(\n%4d%8d%8d%8d%8d,j,HT[j].weight,
显示全部
相似文档