数据结o构课件6.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结o构课件6

【算法】 void PostOrder(BiTree T, Status ( *Visit ) (ElemType e)) { // 流程图如右 InitStack(S); while ( T!=NULL || !StackEmpty(S) ){ while ( T != NULL ){ Push(S,T,0); T = T-lchild; } while ( !StackEmpty(S) GetTopTag(S)==1){ Pop(S, T); Visit(T-data); } if ( !StackEmpty(S) ){ SetTopTag(S, 1); // 设置栈顶标记 T = GetTopPointer(S); // 取栈顶保存的指针 T = T-rchild; }else break; } } ? N N 置栈S为空 T为空 Push(S,T, 0); T=T-lchild 栈S空 栈顶标记置1 T=T-rchild Y Y 栈顶标记为1 N Pop(S, T, tag) 访问T-data Y 三、将二叉树转换为树和森林 1、二叉树转换成森林 抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树 还原:将孤立的二叉树还原成树 A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J A B C D E F G H I J 2、将二叉树转换成树 加线:若p结点是双亲结点的左孩子,则将p的右孩子,右孩子的右孩子,……沿分支找到的所有右孩子,都与p的双亲用线连起来 抹线:抹掉原二叉树中双亲与右孩子之间的连线 调整:将结点按层次排列,形成树结构 A B C D E F G H I A B C D E F G H I A B C D E F G H I A B C D E F G H I A B C D E F G H I 四、树的遍历 遍历——按一定规律走遍树的各个顶点,且使每一顶点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性排列 常用方法 先根(序)遍历:先访问树的根结点,然后依次先根遍历根的每棵子树 后根(序)遍历:先依次后根遍历每棵子树,然后访问根结点 按层次遍历:先访问第一层上的结点,然后依次遍历第二层,……第n层的结点 先根遍历 ?对应二叉树的先序遍历 后根遍历 ?对应二叉树的中序遍历 B C D G I J E K A F H A B D C E H I K J F G 先根:ABCDEFGHIKJ 后根:BCEDAGFKIJH A B C D E F G H I J K L M N O 先序遍历: 后序遍历: 层次遍历: A B E F I G C D H J K L N O M E I F G B C J K N O L M H D A A B C D E F G H I J K L M N O ? 树的应用: 1、统计树(森林)中叶子结点的个数 孩子-兄弟法:每个结点包含一个指向第一个孩子和一个指向 下一个右兄弟的指针域 叶子结点的特征:结点的firstchild为空 统计叶子结点的个数→在遍历的过程中统计firstchild域为空的结点的个数。 【算法】// n为叶子结点的计数器 int n=0; ?void CSleaf(CSTree T) { // 利用树的先序遍历 if ( T != NULL ){// 访问结点-叶子结点的判定和计数 if ( T-firstchild == NULL ) n++; CSleaf(T-firstchild); CSleaf(T-nextsibling); } } // 调用结束,即可由n获得树T的叶子结点数目,需注意下次调用前须n = 0;? ? 2、求树的高度 孩子-兄弟法表示的树: 树的高度 = max(相应左子树的高度+1,右子树的高度) 【算法】 // 引用参数h为T的高度 void CShigh(CSTree T, int h) { // 利用二叉链表的后序遍历 if ( T == NULL ) h = 0; else { CShigh(T-firstchild, h1); CShigh(T-nextsibling, h2); h = max(h1+1, h2); } } 3、求树的度 【算法】// degree表示表示树的度 void CSDegree

文档评论(0)

1haodian + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档