DS05_树a_陈越主编_数据结构选编.pptVIP

  • 8
  • 0
  • 约 35页
  • 2017-03-23 发布于湖北
  • 举报
* 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)

1亿VIP精品文档

相关文档