第二十三讲 树和森林.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第 二十三 讲 知 识 点 在二叉线索树上遍历的算法 树的存储与森林的遍历 树和森林与二叉树的转化 难 点 线索化的递归算法中指针的返回 6、对中序线索链表进行非递归的中序遍历 (算法 6.5 134) Status InOrder(BiTree T, Status (*Visit)(ElemType)) {// T指向头结点,头结点的左链lchild指向根结点,头结点的右链lchild指向中序遍历的最后一个结点。中序遍历二叉线索链表表示的二叉树T, 对每个数据元素调用函数Visit。 BiTree p; p = T-lchild; // p指向根结点 while (p != T) // 空树或遍历结束时 { p==T; while (p-LTag==Link) p = p-lchild; if (!Visit(p-data)) return ERROR; // 访问其左子树为空的结点 while (p-RTag==Thread p-rchild!=T) { p = p-rchild; Visit(p-data); // 访问后继结点 } p = p-rchild; // p进至其右子树 } return OK; } 6.5 树和森林 6.5.1 树的存储结构 一、双亲表示法 每个结点都设置指针指向其双亲 结点定义 typedef struct ptnode {elemtp data; int parent; }ptnode; typedef struct { ptnode nodes[size]; int r,n;//根r和结点数n }ptree; 二、树的二叉链表(孩子-兄弟)表示法 孩子-兄弟链表中结点的类型可以定义如下 typedef struct csnode { int data; struct csnode *firstchld, *nextsibling; //指向第一个孩子和第一个兄弟结点 } CSNODE, *CSNODEPTR; 6.5.2 树和森林与二叉树的转化 一、树与二叉树的转换 1、树-二叉树的步骤 第一个孩子变成左孩子 其他孩子做为前一个孩子的右孩子 2、二叉树-树的步骤 左孩子做孩子 右孩子做为兄弟 二、森林与二叉树的转换 1、森林转化为二叉树:每棵树先变成二叉 树,依次将后一棵二叉树做为前一棵 的右子树。 2、由二叉树转化为森林 从上往下依次取根结点和左子树,再由 二叉树转为树。 6.6 赫夫曼树及其应用 6.6 .1 最优二叉树(赫夫曼树) 1、相关概念 结点间的路径长度:两结点间的分支数目 树的路径长度:树根到每个结点的路径长度之和,完全二叉树是路径长度最短的树 树的带权路径长度WPL :每个叶子结点的路径长度之和,通常记做 表示第k个结点上的权值 (2) 重复以下步骤, 直到F中仅剩下一棵树为止: ①在F中选取两棵根结点的权值最小的二叉树, 做为左右子树构造一棵新的二叉树。置新 的二叉树的根结点的权值为其左、右子树 上根结点的权值之和。 ②在F中删去这两棵二叉树。 ③把新的二叉树加入F。 数 据 结 构 2、赫夫曼树的构造 由给定的n个权值{w0, w1, w2, …, wn-1},构造具有n棵二叉树的森林F = {T0, T1, T2, …, Tn-1},其中每一棵二叉树Ti只有 一个带有权值wi的根结点,其左、右子树 均为空。 数 据 结 构

文档评论(0)

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

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

1亿VIP精品文档

相关文档