构建哈夫曼树的二叉树编码算法详解

需积分: 26 18 下载量 36 浏览量 更新于2024-08-23 收藏 951KB PPT 举报
本资源是关于二叉树的课件PPT,主要讲解了以下几个关键知识点: 1. 二叉树概述: - 定义:二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为左孩子和右孩子。树的根节点没有双亲节点,叶节点(度为0)是最底层的节点,非叶节点(度不为0)称为分支节点。 2. 哈夫曼树(Huffman Tree): - 哈夫曼树是一种带权路径长度最短的二叉树,常用于数据压缩,如霍夫曼编码。在该部分代码中,通过一个while循环,从叶节点开始向上遍历,计算每个节点的哈夫曼编码,确保从叶节点到根节点的编码顺序。 3. 哈夫曼编码过程: - 代码中的`cd->bit[]`数组表示当前节点的编码,通过比较当前节点与父节点的关系来确定`cd->bit[]`中相应位置的值(0或1)。然后将剩余部分的编码转移到`haffCode[]`数组中,更新其起始位置和权重。 4. 树的遍历: - 提到了线索二叉树,这是一种特殊类型的二叉树,通过附加额外信息(线索)来辅助遍历,使得在某些情况下可以更高效地进行搜索。这里可能涉及先序、中序或后序遍历,但具体代码片段并未明确说明哪种遍历方式。 5. 树的存储结构: - 课件还讨论了树的存储结构,包括双亲-孩子关系和兄弟关系的存储实现,这有助于理解如何在内存中高效组织和访问树的数据结构。 6. 树的抽象数据类型: - 提供了树的抽象数据类型定义,包括数据集合(结点及其关系)和操作集合(如创建、删除、查找父、子节点以及遍历等),强调了树作为数据结构的逻辑框架。 总结起来,这份PPT深入浅出地介绍了二叉树的基本概念、哈夫曼树的应用、编码过程以及树的存储和遍历方式,对理解二叉树及其在实际编程中的应用非常有帮助。

完善代码:#include <stdio.h> #include <malloc.h> #include <conio.h> typedef int ElemType; typedef struct BiTreeNode { ElemType data; struct BiTreeNode *lchild, *rchild; } BiTreeNode,*BiTree; void Visit(BiTree bt) { printf("%d ",bt->data); } int max(int x,int y) { if (x>y) return x; else return y; } //二叉树的先序遍历算法 void PreOrder(BiTree bt) /* bt为指向根结点的指针*/ { if (bt) /*如果bt为空,结束*/ { Visit (bt ); /*访问根结点*/ PreOrder (bt -> lchild); /*先序遍历左子树*/ PreOrder (bt -> rchild); /*先序遍历右子树*/ } } //二叉树的中序遍历递归算法 void InOrder(BiTree bt)/* bt为指向二叉树根结点的指针*/ { } //二叉树的后序遍历递归算法 void PostOrder(BiTree bt) /* bt为指向二叉树根结点的指针*/ { } //结合“扩展先序遍历序列”创建二叉树,递归 BiTree CreateBiTree(ElemType s[]) { BiTree bt; static int i=0; ElemType c = s[i++]; if( c== -1) bt = NULL; /* 创建空树 */ else { bt = (BiTree)malloc(sizeof(BiTreeNode)); bt->data = c; /* 创建根结点 */ bt->lchild = CreateBiTree(s); /* 创建左子树 */ bt->rchild = CreateBiTree(s); /* 创建右子树 */ } return bt; } //根据先序序列、中序序列建立二叉树,递归 BiTree PreInOrder(ElemType preord[],ElemType inord[],int i,int j,int k,int h) { BiTree t; //添加代码 return t; } BiTree CreateBiTree_PreIn(ElemType preord[],ElemType inord[],int n) { BiTree root; if (n<=0) root=NULL; else root=PreInOrder(preord,inord,0,n-1,0,n-1); return root; } //统计叶结点个数 int BitreeLeaf ( BiTree bt ) { if ( bt == NULL ) return 0 ; /* 空树,叶子数为0 */ if ( bt->lchild ==NULL&& bt->rchild == NULL) return 1 ; /*只有一个根结点,叶子数为1*/ return ( BitreeLeaf( bt -> lchild ) + BitreeLeaf ( bt -> rchild )) ; } //统计二叉树的深度 int BitreeDepth ( BiTree bt ) { int d = 0,depthL, depthR; /*depthL和depthR分别为左、右子树的深度*/ if ( bt == NULL ) return 0 ; /*空树,深度为0 */ if ( bt -> lchild ==NULL && bt -> rchild == NULL) return 1; /*叶子结点,深度为1 */ depthL = BitreeDepth ( bt -> lchild ) ; /*左子树深度 */ depthR = BitreeDepth ( bt -> rchild ) ; /*右子树深度 */ d = max (dept

2023-05-22 上传