函数指针-UIC.pptVIP

  • 5
  • 0
  • 约3.42千字
  • 约 28页
  • 2018-12-20 发布于天津
  • 举报
函数指针-UIC.ppt

扩充二叉树的概念 把原二叉树的结点都变为度数为2的分支结点 如果原结点的度数为2,则不变 度数为1,则增加一个分支, 度数为0(树叶),则增加两个分支。 空二叉树的扩充二叉树规定为只有一个外部结点组成的二叉树。 加权路径: wi是第i个外部结点的权值 li为从根到第i个外部结点的路径长度 m为外部结点的个数。 WPL = 1 x 5 + 2 x 70 + 3 x 18 + 3 x 7 = 5 + 140 + 54 + 21 = 220 哈夫曼树: 对于一组非负实数{w1 , w2 , w3 ,…, wm},存在一棵以wi(i = 1,2,…,m)为权的m个外部结点的扩充的二叉树,使得带权的外部路径长度WPL最小。这棵二叉树就称为哈夫曼树或最优二叉树。 WPL = 1 x 70 + 2 x 18 + 3 x 5 + 3 x 7 = 70 + 36 + 15 +21 = 142 哈夫曼树(构建算法) 给定m个权值{ w1 , w2 ,…, wm } 构造由m棵二叉树组成的树林F = {T1,T2,…,Tm},其中每棵树Ti 只有一个根结点,且根结点的权值为wi; 在树林中选取两棵根结点权值最小的和次小的二叉树作为左右子树构造一棵新的二叉树,其根结点的权值为左右子树根结点权值之和。 将新的二叉树加入到树林F中,去除原两棵权值最小的树; 重复2、3步骤,直至F中只剩一棵树为止。 在线性结构上实现哈夫曼树 struct HtNode //* 哈夫曼树结点的结构 { int ww; int parent, llink, rlink; }; 哈夫曼树可定义为: struct HtTree { struct HtNode ht[MAXNODE]; int root;/* 树根在数组中的下标*/ }; typedef struct HtTree *PHtTree; 哈夫曼算法(初始化) 问题分析: 优先队列的作用? 找最小值、次小值结点。 优先队列操作流程? 所有叶结点先入队。 弹出两个头部最小结点。 构造一棵子树。 子树头节点入队。 函数指针 函数指针顾名思义就是指向函数的指针。以同类型函数的地址作为值,可以通过间接访问运算来访问所指向的函数。 声明函数指针的格式: ?????? 类型 (*指针变量名)(参数列表); 函数指针的声明是基于函数声明的基础上,把函数名的部分替换为(*变量名)。 例子1: 例如: int (*fp) (int i,intj); 就声名了一个函数指针。该函数指针可以指向带两个整数变量且返回一个整数值的函数。 int add(int a, int b ) { return(a+b); } fp = add;???????????????????? //fp指向add函数 int i = (*fp)(12,15); 函数指针作为参数 在优先队列中引入函数指针 —— 提高抽象数据类型的通用性,实现软件分层 哈夫曼编码:在概率意义上平均码长最短 互不为子串? 树的存储表示 1. 树的父指针表示法? 用一组连续空间存储树的结点,每个结点有一个父结点,在每个结点中设一个指示器指向其双亲结点的位置。 结构类型如下: struct ParTreeNode /* 树中结点结构 */ { DataType info; /* 结点中的元素 */ int parent; /* 结点的父结点位置 */ }; 2. 树的子表表示法 Hu Junfeng Hu Junfeng 哈夫曼树及其应用 哈夫曼树 哈夫曼算法 哈夫曼编码 德 智 5 体 7 70 18 内部节点 Y N Y Y N N 100 德 智 5 体 7 70 18 内部节点 Y N Y Y N N 100 外部路径 两个概念 “外部路径长度” E:在扩充的二叉树里从根到每个外部结点的路径长度之和。 其中,li为从根到第i个外部结点的路径长度,m为外部结点的个数。 设扩充二叉树具有m个带权值的外部结点,那么从根结点到各个外部结点的路径长度与相应结点权值的乘积的和,叫做扩充二叉树的带权的外部路径长度。 其中,wi是第i个外部结点的权值,li为从根到第i个外部结点的路径长度,m为外部结点的个数。 智 体 70 德 7 18 5 内部节点 Y N Y Y N N 100 给定权值 {7,5,2,4},构造哈夫曼树 a b c d 7 5 2 4 (a) 6 7 5 c d (b) 11 b 5 7

文档评论(0)

1亿VIP精品文档

相关文档