DS05_树a_陈越主编_数据结构要点.ppt

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

* 1. 二叉树的遍历 ? 树的遍历是指访问树的每个结点,且每个结点仅被访问一次。二叉树的遍历可按二叉树的构成以及访问结点的顺序分为四种方式,即先序遍历、中序遍历、后序遍历和层次遍历。 (1) 中序遍历 void InOrderTraversal( BinTree BT ) { if( BT ) { InOrderTraversal( BT-Left ); printf(“%d”, BT-Data); InOrderTraversal( BT-Right ); } } 第4章 树 §4.3.4 二叉树的遍历 其遍历过程为: 中序遍历其左子树; 访问根结点; 中序遍历其右子树。 2 1 3 4 5 6 7 8 9 F C B D G I H E A (D B E F) A (G H C I) 中序遍历= D B E F A G H C I * (2) 先序遍历 void PreOrderTraversal( BinTree BT ) { if( BT ) { printf(“%d”, BT-Data); PreOrderTraversal( BT-Left ); PreOrderTraversal( BT-Right ); } } 第4章 树 其遍历过程为: 访问根结点; 先序遍历其左子树; 先序遍历其右子树。 A(B D F E )(C G H I) 先序遍历= A B D F E C G H I 2 1 3 4 5 6 7 8 9 F C B D G I H E A §4.3.4 二叉树的遍历 * (3) 后序遍历 void PostOrderTraversal( BinTree BT ) { if( BT ) { PostOrderTraversal( BT-Left ); PostOrderTraversal( BT-Right); printf(“%d”, BT-Data); } } 第4章 树 其遍历过程为: 后序遍历其左子树; 后序遍历其右子树; 访问根结点。 (D E F B )( H G I C) A 后序遍历= D E F B H G I C A E 4 9 1 3 2 8 6 5 7 F C B D G I H A §4.3.4 二叉树的遍历 * (4) 二叉树的非递归遍历 第4章 树 ? 从二叉树先序、中序和后序的遍历过程的遍历路径来看,都是从根结点A开始的,且在遍历过程中经过结点的路线是一样的,只是访问各结点的时机不同而已。 ? 在图4.16中,并在从入口到出口的曲线上用?、??和?三种符号分别标记出了先序、中序和后序遍历各结点的时刻。 出口 入口 E F C B D G I H A §4.3.4 二叉树的遍历 * void InOrderTraversal( BinTree BT ) { BinTree T BT; Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/ while( T || !IsEmpty(S) ){ while(T){ /*一直向左并将沿途结点压入堆栈*/ Push(S,T); T = T-Left; } if(!IsEmpty(S)){ T = Pop(S); /*结点弹出堆栈*/ printf(“%5d”, T-Data); /*(访问)打印结点*/ T = T-Right; /*转向右子树*/ } } } ?中序遍历非递归遍历算法 第4章 树 ? 遇到一个结点,就把它压栈,并去遍历它的左子树; ? 当左子树遍历结束后,从栈顶弹出这个结点并访问它; ? 然后按其右指针再去中序遍历该结点的右子树。 先序遍历非递归遍历算法只需把访问时机改在进栈时 后序遍历非递归遍历算法比较复杂。作为思考题。 §4.3.4 二叉树的遍历 * ?后序遍历非递归遍历算法 第4章 树 ? 遇到一个结点,就把它(附带标志0以后)压栈,并去遍历它的左子树; ? 当左子树遍历结束后,检查栈顶元素的附带标志是否为0; ? 若标志为0,则把标志改成1,并按其右指针再去遍历该结点的右子树; ? 若标志为1,则从栈顶弹出这个结点并访问它。 ?先序遍历的非递归遍历算法 ? 遇到一个结点,就把它压栈并访问它,然后去遍历它的左子

文档评论(0)

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

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

1亿VIP精品文档

相关文档