[理学]第五章 树.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[理学]第五章 树

满二叉树与完全二叉树 深度为k且有2k-1个结点的二叉树称为满二叉树 深度为k且二叉树,前k-1层全满,第k层从左到右数最后一个结点左侧全满的二叉树称为完全二叉树(不是严格定义) 完全二叉树的性质 性质1 具有n个结点的完全二叉树的深度为 证明: ■ 二叉树的存储方式 顺序存储 按照满二叉树的结点按照从上到下,从左到右的顺序编号,依次存放在数组对应位置。 二叉树的存储方式 顺序存储的缺点 对于非完全二叉树,浪费存储空间 二叉树的存储方式 链式存储 typedef struct _Node { ElemType data; struct _Node* lChild; struct _Node* rChild; struct _Node* parent; //可选 } Node; //可选 typedef Node* BinTree; //或者 typedef struct { Node* root; } BinTree; 二叉树的遍历 遍历二叉树 —— 按某种方法将二叉树所有结点都访问一次且仅访问一次。 递归定义 先(根)序(也称前序) 访问根 前序访问左子树 前序访问右子树 中(根)序 中序访问左子树 访问根 中序访问右子树 后(根)序 后序访问左子树 后序访问右子树 访问根 前序遍历二叉树 顺序: ABDECF 前序遍历二叉树的实现(递归) void preOrder(BinTree root, void (* visit)(Node* n)) { if (root != NULL) { visit(root); preOrder(root-lChild, visit); preOrder(root-rChild, visit); } } void printNode(Node* n) { printf(%c , n-data); } ... void testPostOrderPrint() { BinTree root = testCreateTree(); postOrder(root, printNode); printf(\n); } 练习 —— 二叉树的遍历 完成中序和后序遍历二叉树的函数并测试 释放二叉树占用的空间 void releaseNode(Node* n) { free(n); } ??? 后序遍历! void destroyTree(BinTree root) { postOrder(root, releaseNode); } 二叉树的遍历 已知二叉树的前序和中序遍历结果,构造对应二叉树 前序序列:A B C D E F G 中序序列:C B E D A F G 构造二叉树 前序序列:A B C D E F G 中序序列:C B E D A F G *练习 —— 构造二叉树 编程实现:输入前序遍历和中序遍历字符串,构造对应二叉树,并输出对该树遍历的结果,与输入字符串进行比较,看是否构造正确。 提示:分治法 树的存储结构 双亲表示法 用数组存储树,每个结点保存父结点的索引 缺点:求结点的子结点时需要遍历树 树的存储结构 孩子表示法 用数组存储,数组的每个元素包含一个链表,链表中每一结点保存该元素的一个子结点索引 缺点:不便于求结点的父结点 树的存储结构 父子表示法结合 既存储父结点索引,又存储子结点索引 树与二叉树(二叉链表)的转换 转换方法: 加线:在兄弟之间加一连线 抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系 树与二叉树的转换 森林与二叉树的转换 转换方法: 将各棵树分别转换成二叉树 将每棵树的根结点用线相连 森林与二叉树的转换 赫夫曼(Huffman)编码与赫夫曼树 编码与压缩 定长编码 ASCII – 每个符号(字母、数字、文本符号和特殊符号)用8位二进制数表示 例如 ‘A’ :共可以表示256种符号 变长编码 例如:假设只有四种符号需要编码 a, b, c, d a: 0 b: 1 c: 00 d: 11 赫夫曼编码与赫夫曼树 平均编码长度 其中,x表示各种符号,p(x)表示该符号在整个内容中出现的概率(频率),L(x) 表示该符号对应码字的长度(位数) 对于ASCII码:8位 对于 a: 0 b: 1 c: 00 d: 11 假设每种符号在内容中出现的频率相同,平均编码长度为1.5位 赫夫曼编码与赫夫曼树 定长编码更容易处理,变长编码利于压缩 变长编码的目标是为出现频率高的字符分配较短的代码,为出现频率低的字符分配较长的代码,使得平均编码长度最小,并保证编码是唯一可解的。 以下编码是唯一可解的吗? a: 0 b: 1 c: 00 d: 1

文档评论(0)

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

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

1亿VIP精品文档

相关文档