- 1、本文档共96页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
解码:从根结点起每输入一个数码即沿二叉树下移一层,数码为0时移向左分支,数码为1时移向右分支,待达到叶子结点时即译出一个字符,再输入的数码又从根结点开始重新做起。 将此二叉树与相应的编码方式对照可以发现,每个叶子结点至根的路径长度即等于该叶子结点所代表字符的编码位数。由于将每种字符出现的次数作为对应叶子结点的权,则计算出的带权路径长度wpl即为整个字符串的编码长度。 返回 6.4.1 树的存储结构 1.双亲表示法 2. 孩子表示法 3.孩子兄弟表示法 1.双亲表示法 这种方法用一组连续的空间来存储树中的结点,在保存每个结点的同时附设一个指示器来指示其双亲结点在表中的位置 .其结点的结构如下: 数据域 双亲位置域 data parent 双亲表示法的形式说明如下: #define MAX 100 typedef struct PTNode //结点结构 { ?? TElemType data; ?? int parent; }PTNode; typedef struct //树结构 { PTNode nodes[MAX]; int r,n; //根的位置和结点数 }PTree; 双亲表示法举例 2. 孩子表示法 这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。n个结点共有n个孩子链表(叶结点的孩子链表为空表),而n个结点的数据和n个孩子链表的头指针又组成一个顺序表. 类型说明 typedef struct CTNode?// 孩子链表结点的定 {?int child;??? // 该孩子结点在线性表中的位置 ? struct CTNode * next;//指向下一个孩子结点 }*ChildPtr;? typedef struct??// 顺序表结点的结构定义 { TElemType data;?// 结点的信息 ??? ChildPtr firstChild ;? // 孩子链表的头指针 }CTBox; typedef struct???????????? // 树的定义 {? CTBox ??nodes[MAX]; ????// 顺序表 ?? int n,r;?// 结点数和根的位置 } CTree; 孩子表示法举例 6 7 ^ 4 5 6 3. 孩子兄弟表示法 这种表示法又称为树的二叉表示法,或者二叉链表表示法,即以二叉链表作为树的存储结构。链表中每个结点设有两个链域,分别指向该结点的第一个孩子结点和下一个兄弟(右兄弟)结点。 形式说明 typedef struct CSNode { ??? ElemType data;? /*结点信息*/ Struct CSNode *firstChild, *Nextsibling;? /*第一个孩子,下一个兄弟*/ }CSNode, *CSTree; 孩子兄弟表示法举例 6.4.2 森林与二叉树的转换 树的孩子兄弟链表结构与二叉树的二叉链表结构在物理结构上是完全相同的,只是它们的逻辑含义不同,所以树和森林与二叉树之间必然有着密切的关系。本节我们就介绍树和森林与二叉树之间的相互转换方法。 方法如下: (1)在所有兄弟结点之间加一连线; (2) 对树中的每个结点,只保留其与第一个孩子结点之间的连线,删去其与其它孩子结点之间的连线。? (3)以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。 1.树转换为二叉树 树转换成二叉树举例 森林是若干棵树的集合。树可以转换为二叉树,森林同样也可以转换为二叉树。因此,森林也可以方便地用孩子兄弟链表表示。 方法如下: (1) 将森林中的每棵树转换成相应的二叉树。 (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连在一起后,所得到的二叉树就是由森林转换得到的二叉树。 2.森林转换为二叉树 森林转换成二叉树举例 6.4.3? 树与森林的遍历 1.树的遍历 方法主要有以下两种: (1)? 先根遍历 若树非空,则遍历方法为: 访问根结点。 从左到右,依次先根遍历根结点的每一棵子树。 ??(2)后根遍历 若树非空,则遍历方法为: 从左到右,依次后根遍历根结点的每一棵子树。 访问根结点。 树的遍历举例 如右图树 先根遍历序列为ABECFHGD 后根遍历序列为EBHFGCDA 2.森林的遍历 森林的遍历方法主要有以下两种: (1) 先序遍历 若森林非空,则遍历方法为: 访问森林中第一棵树的根结点。 先序遍历第一棵树的根结点的子树森林。 先序遍历除去第一棵树之后剩余的树构成的森林。 ??? (2)? 后序遍历 若森林非空,则遍历方法为: 后序遍历森林中第一棵树的根结点的子树森林。 访问第一
文档评论(0)