树和二叉树-不再因为别人过得好而焦虑.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
*/96 例2 统计二叉树中叶子结点的数目(4) 【算法3 通过引用参数返回】 // 引用参数n为T的叶子结点数 void leaf(BiTree T, int n) { // 利用二叉树的后序遍历 n = 0; if ( T != NULL ){ leaf (T-lchild, n1); leaf (T-rchild, n2); // 访问结点-叶子结点的判定和计数 if ( T-lchild==NULL T-rchild==NULL ) n++; n += n1+ n2; } } */96 【思路】 ·二叉树为空时,不必释放; ·若T不为空,则先释放其左右子树的所有结点的空间,再释放根结点的空间——后序。 若在释放子树的空间前,先释放根结点的空间,则需要将子树的根结点的指针暂存到其他变量;否则,无法找到子树。 【算法】 void deleteBiTree(BiTree T){ // 此处T应为引用参数 if ( T != NULL ){ deleteBiTree(T-lchild ); deleteBiTree(T-rchild ); // 访问结点-释放结点的空间 free(T); T = NULL; } } 例3 释放二叉树的所有结点空间 */96 例4 删除并释放二叉树中以元素值为x的结点作为根的各子树 (1) 【本例特征】 如何选择二叉树的先序、中序、后序遍历来解决问题,它们对问题求解有何影响? 【思路】 整个过程分为两个方面: ·遍历中查找元素值为x的结点 ·查到该结点时,调用例3的算法释放子树空间。 需要考虑的问题是: ·如何将全部的结点找到并释放? ·外层查找采用的遍历次序对本算法有何影响? 从以下3个算法中可以看出,利用先序遍历是最合适的;中序和后序,存在一定的多余操作。 */96 【算法1】 void deleteXTree(BiTree T, ElemType x) { // 基于先序的查找 if ( T != NULL ){ // 访问结点-判断是否为指定结点-释放树空间 if ( T-data== x ) deleteBiTree(T); else{ // 此处else不能省略 deleteXTree(T-lchild, x); deleteXTree(T-rchild, x); } } } 例4 删除并释放二叉树中以元素值为x的结点作为根的各子树 (2) */96 【算法2】 void deleteXTree(BiTree T, ElemType x) { // 基于中序的查找 if ( T != NULL ){ // 若T-data== x,则此步骤多余 deleteXTree(T-lchild, x); // 访问结点-判断是否为指定结点-释放树空间 if ( T-data== x) deleteBiTree(T); else deleteXTree(T-rchild, x); } } 例4 删除并释放二叉树中以元素值为x的结点作为根的各子树 (3) */96 【算法3】 void deleteXTree(BiTree T, ElemType x) { // 基于后序的查找 if ( T != NULL ){ // 若T-data== x,则此步骤多余 deleteXTree(T-lchild, x); // 若T-data== x,则此步骤多余 deleteXTree(T-rchild, x); // 访问结点-判断是否为指定结点-释放树空间 if ( T-data == x ) deleteBiTree(T); } } 例4 删除并释放二叉树中以元素值为x的结点作为根的各子树 (4) */96 【本例特征】 如何处理多个返回结果? 【思路】 ·待查结点的存在性: 当二叉树为空树,或者k非法时,待查结点不存在 ? 函数应返回待查结点是否存在的状态指示:TRUE或FALSE ·当待查找的结点存在时,需进一步返回该结点的值 问题1:该算法需要返回多个值,如何处理? 答:一种做法是用返回值返回存在性,用变参返回值。 问题2:该算法可以基于二叉树的先序遍历的递归算法来构造,如何知道当前访问的结点是先序序列中的第几个结点? 答:引入计数器,对于该计数器可以采用全局变量来存储,也可以通过变参来处理。 例5 求位于二叉树先序序列中第k个位置的结点的值 (1) */96 【算法】 Status PreorderKnode(BiTree T, int k, ElemType e, int count){ // 输入:T为二叉链表示的二叉树,k为待查找的结点在先序序列中的位序 // 输出:TRUE:待查找的结点存在;FALSE:待查找的结点不

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档