- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3二叉树续,二叉树后续遍历,二叉树进行后续遍历,二叉树,二叉树遍历,完全二叉树,平衡二叉树,二叉树的遍历,二叉树的度,二叉树的深度
例:已知二叉树的先序和中序序列如下,试构造出相应的二叉树。 先序:ABCDEFGHIJ 中序:CDBFEAIHGJ 遍历算法 后序遍历算法: void postorder(Bnode *T) { if (T!=NULL) { postorder(T-lchild); //后序遍历T的左子树 postorder(T-rchild); //后序遍历T的右子树 visite(T); //访问T的根结点 } } 遍历算法的执行过程 模拟算法对如图所示二叉树的中序遍历的执行过程。 二叉树遍历算法的应用 例1:设计算法按中序次序输出二叉树T中度为2的结点的值。 例2:设计算法求二叉树T的结点数。 void inorder(Bnode *T) { if (T!= NULL) { inorder(T-lchild); n++; //对当前结点计数 inorder(T-rchild); } } 例3:设计算法求解给定二叉树的高度。 int high(Bnode *T) { if (T==NULL) return 0; else return max(high(T-lchild),high(T-rchild))+1; } (1)双亲表示法 树中每个结点的存储信息包括:结点的值data和 父亲结点的地址。 (2)孩子链表 (3)孩子-兄弟链表(二叉链表) 每棵树对应唯一一棵二叉树。 4.3.2 (树)森林与二叉树的转换 (1)森林到二叉树的转换 森林T=(T1,T2,……,Tm),将森林T转换为对应的二叉树BT的方法如下: 如果m=0,则BT为空;否则依次作如下操作: 将T1的根作为BT的根; 将T1的子树森林转换为BT的左子树; 将(T2,T3,……,Tm)转换为BT的右子树。 例: (2)二叉树到森林的转换 将二叉树BT转换为森林T=(T1,T2……Tm)的方法如下: 若BT不空,则依次执行如下操作: 将BT的根转换为T1的根; 将BT的左子树转换为T1的子树森林; 将BT的右子树转换为(T2,……Tm) 4.3.3 树(森林)的遍历 (1)先序遍历森林T=(T1,T2……Tm): 若T不空,则: 访问T1的根; 先序遍历T1的子树森林; 先序遍历森林(T2,T3……Tm)。 先序遍历序列:ABEKFGCHIDJLMNOP (与对应二叉树的先序序列相同) (2)后序遍历森林T=(T1,T2……Tm): 如果T不空,则: 后序遍历T1的子树森林; 访问T1的根; 后序遍历森林(T2,T3……Tm); 后序遍历序列:KEFGBHICJDAMNLPO (与对应二叉树的中序序列相同) 4.4 哈夫曼树 引例:设计一个将百分成绩转换为等级制的算法,具体要求如下: A:90~100 B:80~89 C:70~79 D:60~69 E:0~59 定义:给定一组数值{w1,w2,……wn}作为叶子结点的权值,构造一棵二叉树。如果∑wiLi最小,则称此二叉树为最优二叉树(哈夫曼树)。并称∑wiLi为带权路径长度。 哈夫曼算法(构造哈夫曼树): (1)根据给定的n个权值{w1,w2,…,wn},构成n棵二叉树的集合T={T1,T2,…,Tn},其中每个Ti只有一个带权为wi的根结点,其左右子树均空。 (2)从T中选两棵根结点权值最小的二叉树(设为T1’、T2’)作为左右子树构成一棵新的二叉树T1’’,并且置新二叉树的根值为其左右子树的根结点的权值之和。 (3)将T1’’并入到T中,同时从T中删除T1’、T2’。 (4)重复(2)、(3),直到T中只有一棵树为止,这棵树就是哈夫曼树。 例:以集合{3,4,5,6,8,10,12,18}为叶子结点的权值构造哈夫曼树,并计算其带权路径长度。 应用实例:哈夫曼编码 已知一个文件中仅有8个不同的字符,各字符出现的次数分别是3、4、8、10、16、18、20、21。试重新为各字符编码,以节省存储空间。 * * 先序:ABCDEFGHIJ 中序:CDBFEAIHGJ BCDEF CDBFE GHIJ IHGJ A CD CD EF FE HI IH J J A C B A J E C B F D G H I 先序遍历算法: void preorder (Bnode *T) { if (T!=NULL) { visite(T); //访问T的根结点 preorder(T-lc
文档评论(0)