6.1树类型定义.ppt

  1. 1、本文档共129页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
树形图表示的例子 二、按层次遍历二叉树 实现方法为从上层到下层,每层中从左侧到右侧依次访问每个结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每个结点的遍历序列。 五、中序遍历算法的非递归描述 中序遍历示意图 6.5 线索二叉树 何谓线索二叉树? 线索链表的遍历算法 如何建立线索链表? 线索链表的结点结构 ltag和rtag是增加的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前驱或后继的线索。???? ABCDEFGHI 6.8 哈 夫 曼 树 与 哈 夫 曼 编 码 最优树(哈夫曼树)的定义 如何构造最优树 前缀编码 哈夫曼编码 注意: ?? ① 初始森林中的n棵二叉树,每棵树有一个孤立的结点,它们既是根,又是叶子 ??? ② n个叶子的哈夫曼树要经过n-1次合并,产生n-1个新结点。最终求得的哈夫曼树中共有2n-1个结点。 ??? ③ 哈夫曼树是严格的二叉树,没有度数为1的分支结点。 前缀编码 在电文传输中,需要将电文中出现的每个字符进行二进制编码。在设计编码时需要遵守两个原则: (1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即解码结果与发送方发送的电文完全一样; (2)发送的二进制编码尽可能地短。下面我们介绍两种编码的方式。 哈夫曼编码的构造方法 : (1)利用字符集中每个字符的使用 频率作为权值构造一个哈夫曼树; (2)从根结点开始,为到每个叶子 结点路径上的左分支赋予0,右分支 赋予1,并从根到叶子方向形成该叶子 结点的编码。 例如: 假设有一个电文字符集中有8个字符,每个字符 的使用频率分别为{0.05,0.29,0.07,0.08,0.14,0.23, 0.03,0.11},现以此为例设计哈夫曼编码。 为方便计算,将所有字符的频度乘以100,使 其转换成整型数值集合,得到{5,29,7,8,14,23, 3,11}; 哈夫曼编码设计如下图: 哈夫曼树的存储结构 用一个大小为2n-1的向量来存储哈夫曼树中 的结点,其存储结构为: ? typedef struct { //结点类型 ????? int weight; //权值,不妨设权值均大于零 ????? int lchild,rchild,parent; //左右孩子及双亲指针 ??? }HTNode,*HuffmanTree; Typedef char **Huffmancode; //从叶子到根逆向求每个字符的赫夫曼编码 ?? HC=(Huffmancode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char *)); cd[n-1]=“\0”; 例如: B E C F D G H I J K B C D E F G H I J K 由此,树的各种操作均可对应二叉树的操作来完成。 应当注意的是,和树对应的二叉树,其左、右子树的概念 已改变为: 左是孩子,右是兄弟。 6.7 树和森林的遍历 一、树的遍历 二、森林的遍历 树的遍历可有三条搜索路径: 按层次遍历: 先根(次序)遍历: 后根(次序)遍历: 若树不空,则先访问根结点,然后依次先根遍历各棵子树。 若树不空,则先依次后根遍历各棵子树,然后访问根结点。 若树不空,则自上而下自左至右访问树中每个结点。 一、树的遍历 先根遍历时顶点的访问次序: A B C E F G D 后根遍历时顶点的访问次序: B E G F C D A 层次遍历时顶点的访问次序: A B C D E F G A B C D E F G B C D E F G H I J K 1.森林中第一棵树的根结点; 2.森林

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档