第06章-树和二叉树.ppt

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

Strategic Architect Forum 2004 第六章 树和二叉树 遍历结果(中缀表达式) a + b * c - d - e / f 说明: 1)遍历的第一个和最后一个结点 第一个结点: 先序:根结点; 中序:沿着左链走,找到一个没有左孩子的结点; 后序:从根结点出发,沿着左链走,找到一个既没有左孩子又没有右孩子的结点。 最后一个结点: 先序:从根结点出发,沿着右链走,找到一个没有右孩子的结点;如果该结点有左孩子,再沿着其左孩子的右链走,依次类推,直到找到一个没有孩子的结点; 中序:从根结点出发,沿着右链走,找到一个没有右孩子的结点; 后序:根结点。 求中序的第一个结点的算法: P=T; while (P-lchild) P=P-lchild; printf(P-data); 求中序的最后一个结点的算法: P=T; while(P-rchild) P=P-rchild; Printf(P-data); 2)“先序+中序” 或 “后序+中序”均可唯一地确定一棵二叉树 3)若具有n个结点的二叉树采用二叉链表存储结构,则该链表中共有2n个指针域,其中只有n-1个用来指示结点的左、右孩子,其余的n+1个指针域为空。 遍历二叉树的非递归算法 先序遍历: 算法1,将右子树根结点 入栈,(栈所需最大容量为n/2+1); 算法2,将根结点入栈 遍历二叉树的非递归算法 中序遍历: 在遍历左子树之前,先把根结点入栈,当左子树遍历结束后,从栈中弹出,访问,再遍历右子树 遍历二叉树的非递归算法 后序遍历: 1)设定一个指针,指向最近访问过的结点。在退栈取出根结点时,需判断:若根结点的右子树为空,或它的右子树非空,但已遍历完毕,即它的右子树根结点恰好是最近一次访问过的结点时,应该遍历该根结点。反之,该根结点应重新入栈,先遍历它的右子树。 2)还可同时设定一个标记,指示该根结点是第一次还是第二次入栈。 5、建立二叉树的存储结构 不同的定义方法相应有不同的存储结构的建立算法 typedef struct BiThrNode { datatype data; unsigned ltag, rtag; struct BiThrNode *lchild, *rchild; }BiThrNodeType,*BiThrTree; 线索二叉树的基本操作实现 1.建立一棵中序线索化二叉树 4.在中序线索二叉树上查找值为x的结点(带头结点) 6.8 赫 夫 曼 树 与 赫 夫 曼 编 码 最优二叉树(赫夫曼树)的定义 如何构造赫夫曼树 (赫夫曼算法) 前缀编码与赫夫曼编码 在解某些判定问题时,利用赫夫曼树可以得到最佳判定算法。例如,要编制一个将百分制转换成五级分制的程序。只要利用条件语句便可完成。如: if (a60) b=〞不及格〞; else if(a70) b=〞及格〞; else if(a80) b=〞中等〞; else if(a90) b=〞良好〞; else b=〞优秀〞; 这个判定过程用图6.23(a)的判断树来表示。如果上述程序需反复使用,而且每次的输入数据量很大,则应考虑上述程序的执行效率。在实际考试中,学生的成绩在五个等级上的分布是不均匀的。假设其分布规律如下表所示: 如果按6.23(a)所示判断树执行条件语句,80%的数据(大于70分人数占80%)需进行三次或三次以上的比较才能得出结果。怎样能提高效率,减少判断次数?从分数分布表知道,如果将比例数(权值)较大的在条件语句的最前面判断,权值小的在后面判断,就能提高判断效率。如图6.23(b)所示的判断树,比6.23(a)判断次数少。按此判定树可写出相应的程序。 2.赫夫曼树的构造 赫夫曼(Huffman)最早给出了一个带有一般规律的算法,俗称赫夫曼算法,叙述如下: (1)给定的n个权值{w1,w2,…,wn}构成n棵二叉树的集合,即森林F={T1,T2,…,Tn },其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。 (2)在F中选取两棵根结点的权值最小的树minL、minR,作为左右子树构造一棵新的二叉树t,且置t二叉树的根结点的权值为minL和minR上根结点的权值之和。 (3)在F中删除minL、minR这两棵树,同时将新二叉树t加入F中。 (4)重复(2)和(3),直到F只含一棵树为止。这棵树便是赫夫曼树。 3. 赫夫曼编码 例如,需要从甲地向乙地传送

文档评论(0)

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

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

1亿VIP精品文档

相关文档