软件技术基础09--树结构.ppt

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 树的应用 核心算法分析 1、新元素与树根结点比较。 2、如果比根小,则取根的左子树,回到1;如果根无左子树,则将新结点插入在根结点左孩子处 3、如果比根大,取根的右子树,回到1;如果根无右子树,则将新结点插入在根结点右孩子处 71 65 40 88 67 90 60 70 树的应用 核心算法 1、新元素与树根结点比较。 2、如果比根小,则取根的左子树,回到1;如果根无左子树,则将新结点插入在根结点左孩子处 3、如果比根大,取根的右子树,回到1;如果根无右子树,则将新结点插入在根结点右孩子处 设p指向树根; if(new_node-data p-data){ p = p-Lchild;}else{ ……} if(p-Lchild == NULL) p-Lchild = new_node; break;} { while( p != NULL){ } 2 20 6 15 树的应用 例:哈夫曼树 最优二叉树 最小费用树 什么是哈夫曼树、怎样建立、有什么用? 哈夫曼树是最优二叉树 最优? 路径带权总长最小 路径?从树根到节点经历的分支序列,路径长度是分支数目 总长?从根到所有节点的路径长度之和 带权?(仅)叶节点带有权值 带权路径长度:路径长度×权值 树的带权路径长度:所有带权路径长度之和 树的应用 5 7 2 4 5 7 2 4 5 7 2 4 带权路径长: 5×2+7×2+2×2+4×2= 36 5×2+7×3+4×3+2×1= 46 2×3+4×3+5×2+7×1= 35 哈夫曼树 树的应用 哈夫曼树的建立 1)带有权值的节点分别构成独立的树 2)每次选择两个最小权值的根的树 3)生成一个新的根将选出的树挂在下面,分别为左右子树 新的根的权值为两个子树的权值之和 4)反复进行直到所有的节点都挂到一颗树上 5 7 2 4 6 5 7 2 4 11 (a) (b) 5 7 2 4 证明:按这个过程建立的二叉树是最优二叉树(略) (c) 树的应用 哈夫曼树的应用:压缩编码 设通信中只出现A、B、C、D四个字符,通信总量为n 如果每个字符使用两位二进制编码,则数据量为2n 如果利用字符出现次数作为节点权值,建立哈夫曼树,并利用其编码,可获得较少的编码数据量 5 117 2 4 0 1 1 1 0 0 规定:在二叉树上向左使用0编码,向右使用1编码 假设,A出现117次,B出现2次, C出现4次,D出现5次 根据哈夫曼树 A使用0编码 B用110 C用111 D用10 总编码长117×1+5×2+4×3+2×3 = 145位 否则,要使用256位! 扩展:堆结构(heap) 堆是一种特殊的树结构 堆中某个节点的值总是大于或小于其父节点的值; 或者说:堆的根节点值是最小/大的,其子树也是堆。 堆常用于排序 4 8 9 12 10 11 穿线二叉树 3.6.2穿线规则 A B C D E F G H I J K L M N O P Q 中根遍历(左根右),右子树为空的节点右指针指向 遍历序的下一个节点 F G C E H B D J I A L N P O Q M K 利用空指针,指向遍历下一结点 遍历不需要栈的帮助 中根遍历 头指针 作业 1、请画出A、B、C三个结点构成的二叉树的所有形态 2、写出右面这棵二叉树的三种遍历顺序 3、编写递归算法统计一棵二叉树上元素值为X的叶节点数量 4、设一棵二叉树的后序和中序遍历顺序分别为: XDBEFAC BXDCAEF 请重构这棵二叉树(要给出重构过程) 5、在顺序存储二叉树的方法中下标是9的结点,父节点是谁,两个子节点又分别在哪里?请把右边的树用顺序存储 6、双向链表与二叉树链表有什么异同 C B X F A E D * * * * * * * * * * * * * * * * * * * * * * * A B C D E F G H I J K L M N O P Q 1、树(子树)根入栈,不访问 2、左子树入栈,左子树的各子树根依次入栈即反复进行步骤1 3、当左子树为空时,出栈,访问根结点 4、根节点右子树入栈 (新树入栈,到步骤1去遍历右子树) 5、当右子树为空时, 出栈,访问(祖先)爷结点, 将爷结点的右子树入栈 (新树入栈,回到步骤1) 树入栈后一直朝左走(一路进栈),走不动时出栈访问节点。然后进入该节点右子树。如果其右子树为空,就再往上退,访问祖先节点,进入被访问节点的右子树 A B C F G E H D 算法框架 “遍历” while( ! en

文档评论(0)

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

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

1亿VIP精品文档

相关文档