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

6.6 哈夫曼树及其应用 1、输出二叉树T中度为2的结点的值 算法基本思想: 本算法和中序遍历算法相似。相同之处是输出次序均为中序;不同之处是在输出其中度为2的结点的值,即为有条件输出。  为此,只需将中序遍历中的访问改为条件输出即可。 2、求二叉树的深度(后序遍历) 算法基本思想: 从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。 首先分析二叉树的深度和它的左、右子树深度之间的关系。 3、统计二叉树中叶子结点的个数 算法基本思想: 先序(或中序或后序)遍历二叉树,在遍历过程中查找叶子结点,并计数。 由此,需在遍历算法中增添一个“计数”的参数,并将算法中“访问结点”的操作改为:若是叶子,则计数器增1。 void CountLeaf (BiTree T){ if ( T ) { if ((!T-lchild) (!T-rchild)) count++; // 对叶子结点计数 CountLeaf( T-lchild); CountLeaf( T-rchild); } // if } // CountLeaf 二叉树递归算法的讨论:  在明确所要编写的算法的功能描述的基础上,按如下步骤讨论算法的实现: (1) 如果T为空,则按预定功能实现对空树的操作,以满足要求(相应参数、变量的操作)。 (2) 否则在假设算法对T左右子树能分别实现预定功能的基础上调用对左右子树算法的功能。 以字符串的形式 根 左子树 右子树 定义一棵二叉树 例如: A B C D 以空白字符“ ”表示 A(B( ,C( , )),D( , )) 空树 只含一个根结点的二叉树 A 以字符串“A ”表示 以下列字符串表示 4、建立二叉树的存储结构 Status CreateBiTree(BiTree T) {  ch=getchar( );  if (ch== ) T = NULL;  else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))   exit(OVERFLOW); T-data = ch; // 生成根结点 CreateBiTree(T-lchild); // 构造左子树 CreateBiTree(T-rchild); // 构造右子树 } return OK; } // CreateBiTree A B C D A B C D 上页算法执行过程举例如下: A T B C D ^ ^ ^ ^ ^ 6.3.2 线索二叉树  为了保留结点在某种遍历序列中直接前驱和直接后继的位置信息,可以利用二叉树的二叉链表存储结构中的那些空指针域来指示。 在二叉树的先序、中序或后序遍历序列中 两个相邻的结点互称为前驱与后继。 指向前驱或后继结点的指针称为线索。 加上线索的二叉链表表示的二叉树叫线索 二叉树。 对二叉树按某种遍历次序使其变为线索二 叉树的过程叫线索化。 线索二叉树的结构  如何分指针域内存放的是指针还是线索?  利用某结点空的左指针域(lchild)指出该结点在某种遍历序列中的直接前驱结点的存储地址,利用结点空的右指针域(rchild)指出该结点在某种遍历序列中的直接后继结点的存储地址;对于那些非空的指针域,则仍然存放指向该结点左、右孩子的指针。  出发点:若采用二叉链表存储具有n个结点的二叉树,则在2n个指针域中有n-1个指针域指向结点的孩子的,而另外n+1个指针域为空。  为每个结点增设两个标志位域LTag和RTag: 0 lchild指向结点的左孩子 1 lchild指向结点的前驱结点 LTag= RTag= 0 rchild指向结点的右孩子 1 rchild指向结点的后继结点 RTag rchild data lchild LTag 结构示意图: typedef struct BiThrNod { ElemType data; struct BiThrNode *lchild, *rchild; // 左右指针 int LTag, RTag; // 左右标志 } BiThrNode, *BiThrTree; 线索链表的类型描述: 0:指针,1:线索 A B C D E 先序线索二叉树 先序序列:A B C D E

文档评论(0)

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

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

1亿VIP精品文档

相关文档