遍历非递归算法精选文档.ppt





《遍历非递归算法精选文档.ppt》由会员分享,可在线阅读,更多相关《遍历非递归算法精选文档.ppt(116页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、遍历非递归算法1本讲稿第一页,共一百一十六页2递归函数的主要优点是可以把算法写的比使用非递归函数时更递归函数的主要优点是可以把算法写的比使用非递归函数时更递归函数的主要优点是可以把算法写的比使用非递归函数时更递归函数的主要优点是可以把算法写的比使用非递归函数时更清晰更简洁,而且某些问题,特别是与人工智能有关的问题,清晰更简洁,而且某些问题,特别是与人工智能有关的问题,清晰更简洁,而且某些问题,特别是与人工智能有关的问题,清晰更简洁,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法。递归的另一个优点是,递归函数不会受到更适宜用递归方法。递归的另一个优点是,递归函数不会受到更适宜用递归方
2、法。递归的另一个优点是,递归函数不会受到更适宜用递归方法。递归的另一个优点是,递归函数不会受到怀疑,较非递归函数而言,某些人更相信递归函数。怀疑,较非递归函数而言,某些人更相信递归函数。怀疑,较非递归函数而言,某些人更相信递归函数。怀疑,较非递归函数而言,某些人更相信递归函数。本讲稿第二页,共一百一十六页3以先序遍历为例:以先序遍历为例:void PreOrder(BiTree T)if(T)coutdata;PreOrderTraverse(T-lchild);PreOrderTraverse(T-rchild);A AB BC CD DE EF FHHGG本讲稿第三页,共一百一十六页4A
3、AB BC CD DE EF FHHGGB BD DGGNULLNULLD DNULLNULLGGC CE EF FHHF FHHNULLNULLGGNULLNULLNULLNULLNULLNULLNULLNULLHHE ENULLNULLNULLNULL本讲稿第四页,共一百一十六页5遍历二叉树的非递归算法遍历二叉树的非递归算法需用到栈,顺序栈的定义如下:需用到栈,顺序栈的定义如下:#define size 100 typedef struct Type data size;int top;SqStack;本讲稿第五页,共一百一十六页61.先序非递归遍历:先序非递归遍历:(1)初始化一个堆栈初
4、始化一个堆栈(2)把根结点入栈把根结点入栈(3)当堆栈非空时,循环当堆栈非空时,循环:A.出栈取一个结点指针,访问该结点出栈取一个结点指针,访问该结点;B.若该若该结点右子树非空,右子树指针入栈结点右子树非空,右子树指针入栈(4)左端到尽头后左端到尽头后,若该若该栈非空,右子树出栈栈非空,右子树出栈本讲稿第六页,共一百一十六页7先序遍历的非递归算法先序遍历的非递归算法StatusInorderTraverseStatusInorderTraverse(BiTreeT(BiTreeT)/采用二叉链表存储结构采用二叉链表存储结构.先序遍历二叉树先序遍历二叉树T的非递归算的非递归算法法。InitSt
5、ack(S);p=T;while(p|!StackEmpty(S)while(p)/访问当前结点,右子进栈访问当前结点,右子进栈访问当前结点,右子进栈访问当前结点,右子进栈,遍历左子树遍历左子树遍历左子树遍历左子树coutdata;if(p-rchild!=null)Push(S,p-rchild);p=p-lchild;if(StackEmpty(S)=0)/根指针退栈,遍历右子树根指针退栈,遍历右子树Pop(S,p);本讲稿第七页,共一百一十六页8步骤步骤指针指针P P栈栈StackStack内容内容访问结点值访问结点值初态初态A A1 1B BC CA A2 2D DGGB B3 3 D
6、 D4 4GG5 5C CF FGG6 6E E C C7 7 F F E E8 8F F9 9 F FA AC CB BF FE ED DGGwhile(p)while(p)/访问当前结点,右子进栈,访问当前结点,右子进栈,访问当前结点,右子进栈,访问当前结点,右子进栈,遍历左子树遍历左子树遍历左子树遍历左子树 coutdata;coutdata;if(p-rchild!=null)if(p-rchild!=null)Push(SPush(S,p-rchild);p-rchild);p=p-lchild;p=p-lchild;if(StackEmpty(S)=0)if(StackEmpty(
7、S)=0)/根指针退栈,根指针退栈,根指针退栈,根指针退栈,遍历右子树遍历右子树遍历右子树遍历右子树Pop(SPop(S,p);p);本讲稿第八页,共一百一十六页92.2.中序非递归遍历:中序非递归遍历:中序非递归遍历:中序非递归遍历:在遍历左子树之前,先把根结点入栈,当左子树遍历结束后,从栈在遍历左子树之前,先把根结点入栈,当左子树遍历结束后,从栈在遍历左子树之前,先把根结点入栈,当左子树遍历结束后,从栈在遍历左子树之前,先把根结点入栈,当左子树遍历结束后,从栈中弹出,访问,再遍历右子树中弹出,访问,再遍历右子树中弹出,访问,再遍历右子树中弹出,访问,再遍历右子树本讲稿第九页,共一百一十六页
8、10voidInOrder(BiTreeT)voidInOrder(BiTreeT)/采用二叉链表存储结构。先序遍历二叉树采用二叉链表存储结构。先序遍历二叉树采用二叉链表存储结构。先序遍历二叉树采用二叉链表存储结构。先序遍历二叉树T T的非递归算法。的非递归算法。的非递归算法。的非递归算法。InitStack(S);InitStack(S);Push(SPush(S,T);T);/根指针进栈根指针进栈根指针进栈根指针进栈while(p|!StackEmpty(S)while(p|!StackEmpty(S)while(p!=NULL)while(p!=NULL)Push(SPush(S,p);
9、p);/向左走到尽头向左走到尽头向左走到尽头向左走到尽头p=p-lchild;p=p-lchild;if(!StackEmpty(S)if(!StackEmpty(S)Pop(SPop(S,p);p);coutdata;coutdata;/访问结点访问结点访问结点访问结点p=p-rchild);p=p-rchild);/向右一步向右一步向右一步向右一步 中序遍历的非递归算法中序遍历的非递归算法1本讲稿第十页,共一百一十六页11步骤步骤指针指针P P栈栈StackStack内容内容访问结访问结点值点值初态初态A A1 1A ABABA2 2B BDBADBA3 3D D DBADBA4 4 DB
10、ADBA5 5D DGBAGBAD D6 6GG GBAGBA7 7 GBAGBA8 8GG BABAGG9 9 BABA1010B B A AB B1111 A A1212A AC CA A1313C CECEC1414E E ECECA AC CB BF FED DGwhile(p!=NULL)while(p!=NULL)Push(SPush(S,p);p);/向左走到尽头向左走到尽头向左走到尽头向左走到尽头p=p-lchild;p=p-lchild;if(!StackEmpty(S)if(!StackEmpty(S)Pop(SPop(S,p);p);coutdata;coutdata;/
11、访问结点访问结点访问结点访问结点p=p-rchild);p=p-rchild);/向右一步向右一步向右一步向右一步本讲稿第十一页,共一百一十六页121515 ECEC1616E E C CE E1717 C C1818C CF FC C1919F F F F2020 F F2121F F F F2222 A AC CB BF FE ED DGG本讲稿第十二页,共一百一十六页13中序遍历的非递归算法中序遍历的非递归算法中序遍历的非递归算法中序遍历的非递归算法2(2(算法算法)自学自学自学自学StatusInorderTraverse(BiTreeTStatusInorderTraverse(Bi
12、TreeT,Status(*visit(TElemTypee)Status(*visit(TElemTypee)/采用二叉链表存储结构,采用二叉链表存储结构,采用二叉链表存储结构,采用二叉链表存储结构,VisitVisit是对数据元素操作的应用函是对数据元素操作的应用函数。先序遍历二叉树数。先序遍历二叉树T T的非递归算法,对每个数据元素调用函的非递归算法,对每个数据元素调用函的非递归算法,对每个数据元素调用函的非递归算法,对每个数据元素调用函数数数数Visit。InitStack(S);p=T;while(p|!StackEmpty(S)if(p)/根指针进栈,遍历左子树根指针进栈,遍历左子
13、树根指针进栈,遍历左子树根指针进栈,遍历左子树Push(SPush(S,p);p=p-lchild;p);p=p-lchild;elseelse/访问结点,根指针退栈,遍历右子树访问结点,根指针退栈,遍历右子树访问结点,根指针退栈,遍历右子树访问结点,根指针退栈,遍历右子树Pop(SPop(S,p);visit(p-data);p=p-rchild;p);visit(p-data);p=p-rchild;本讲稿第十三页,共一百一十六页14步骤步骤指针指针P P栈栈StackStack内容内容访问结访问结点值点值初态初态A A1 1B BA A2 2D DBABA3 3 DBADBA4 4GGB
14、ABAD D5 5 GBAGBA6 6 BABAGG7 7 A AB B8 8C CA A9 9E EC C1010 ECEC1111 C CE E1212F F C C1313 F F1414 F FA AC CBF FE ED DGGif(p)if(p)/根指针进栈,遍历左子树根指针进栈,遍历左子树根指针进栈,遍历左子树根指针进栈,遍历左子树Push(SPush(S,p);p=p-p);p=p-lchild;lchild;elseelse/访问结点,根指针退栈,遍访问结点,根指针退栈,遍访问结点,根指针退栈,遍访问结点,根指针退栈,遍历右子树历右子树历右子树历右子树Pop(S,p);vis
15、it(p-p);visit(p-data);p=p-rchild;data);p=p-rchild;本讲稿第十四页,共一百一十六页153.后序非递归遍历后序非递归遍历后序非递归遍历后序非递归遍历(自学自学自学自学)与前序遍历和中序遍历二叉树的算法不同,在后续遍历二叉树的与前序遍历和中序遍历二叉树的算法不同,在后续遍历二叉树的与前序遍历和中序遍历二叉树的算法不同,在后续遍历二叉树的与前序遍历和中序遍历二叉树的算法不同,在后续遍历二叉树的过程中,对一个结点访问之前,要过程中,对一个结点访问之前,要过程中,对一个结点访问之前,要过程中,对一个结点访问之前,要两次经历这个结点两次经历这个结点两次经历这
16、个结点两次经历这个结点。第一次是由该结点找到其左孩子结点,遍历其左子树,遍历第一次是由该结点找到其左孩子结点,遍历其左子树,遍历完左子树后,返回到这个结点。完左子树后,返回到这个结点。第二次是由该结点找到其右孩子结点,遍历其右子树,遍历完右子第二次是由该结点找到其右孩子结点,遍历其右子树,遍历完右子第二次是由该结点找到其右孩子结点,遍历其右子树,遍历完右子第二次是由该结点找到其右孩子结点,遍历其右子树,遍历完右子树后,再次返回到结点,这时才能访问该结点。树后,再次返回到结点,这时才能访问该结点。树后,再次返回到结点,这时才能访问该结点。树后,再次返回到结点,这时才能访问该结点。因此,用非递归方
17、法后续遍历二叉树时,也需要设置一个栈结构,因此,用非递归方法后续遍历二叉树时,也需要设置一个栈结构,因此,用非递归方法后续遍历二叉树时,也需要设置一个栈结构,因此,用非递归方法后续遍历二叉树时,也需要设置一个栈结构,用来保存指向所经历结点的指针。用来保存指向所经历结点的指针。用来保存指向所经历结点的指针。用来保存指向所经历结点的指针。本讲稿第十五页,共一百一十六页16从上面的分析可知,在后续遍历二叉树时,一个指针要进出栈两从上面的分析可知,在后续遍历二叉树时,一个指针要进出栈两从上面的分析可知,在后续遍历二叉树时,一个指针要进出栈两从上面的分析可知,在后续遍历二叉树时,一个指针要进出栈两次,第
18、一次出栈的目的是由该指针找到其左孩子结点,对该结点次,第一次出栈的目的是由该指针找到其左孩子结点,对该结点次,第一次出栈的目的是由该指针找到其左孩子结点,对该结点次,第一次出栈的目的是由该指针找到其左孩子结点,对该结点并不做任何处理,因此出栈后需再次进栈,只有在他第二次出栈并不做任何处理,因此出栈后需再次进栈,只有在他第二次出栈并不做任何处理,因此出栈后需再次进栈,只有在他第二次出栈并不做任何处理,因此出栈后需再次进栈,只有在他第二次出栈后,才能访问该结点。后,才能访问该结点。后,才能访问该结点。后,才能访问该结点。为了区别同一个结点两次出栈,设置一个标志为了区别同一个结点两次出栈,设置一个标
19、志为了区别同一个结点两次出栈,设置一个标志为了区别同一个结点两次出栈,设置一个标志flagflag,令:,令:,令:,令:11第一次出栈,结点不能访问第一次出栈,结点不能访问第一次出栈,结点不能访问第一次出栈,结点不能访问flag=flag=22第二次出栈,结点可以访问第二次出栈,结点可以访问第二次出栈,结点可以访问第二次出栈,结点可以访问本讲稿第十六页,共一百一十六页17PostOrder(BiTreet)SqStacksMAX;BiTreep;intsign;if(t=NULL)retrun;top=-1;p=t;while(!(p=NULL&top=-1)if(p!=NULL)s+top
20、.link=p;stop.flag=1;p=p-lchild;本讲稿第十七页,共一百一十六页18elsep=stop.link;sign=stop-.flag;if(sign=1)s+top.link=p;stop.flag=2;p=p-rchild;elseprintf(“%c”,p-data);p=NULL;本讲稿第十八页,共一百一十六页19本讲稿第十九页,共一百一十六页204.按层次遍历二叉树按层次遍历二叉树实现方法为从上层到下层,每层中从左侧到右侧依次访问每个实现方法为从上层到下层,每层中从左侧到右侧依次访问每个实现方法为从上层到下层,每层中从左侧到右侧依次访问每个实现方法为从上层到下
21、层,每层中从左侧到右侧依次访问每个结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每结点。下面我们将给出一棵二叉树及其按层次顺序访问其中每个结点的遍历序列。个结点的遍历序列。个结点的遍历序列。个结点的遍历序列。A ACB BF FE ED DG按层次遍历该二叉树的序列为:按层次遍历该二叉树的序列为:按层次遍历该二叉树的序列为:按层次遍历该二叉树的序列为:ABCDEFGHABCDEFGH本讲稿第二十页,共一百一十六页21二叉树用顺序存储结构表示时,按层遍历的算法实现:二叉树用顺序存储结
22、构表示时,按层遍历的算法实现:二叉树用顺序存储结构表示时,按层遍历的算法实现:二叉树用顺序存储结构表示时,按层遍历的算法实现:A AC CB BF FE ED DGGAB BC CD DE EF FGG0 01 12 23 34 456 671 12 234 456 67A ACB BF FD DGGA BC CD D#FGG01 12 2345 56 671 12 23 346 67 75 5本讲稿第二十一页,共一百一十六页22voidLevelOreder(SqBiTreeBT)for(i=1;i=n;i+)if(BT.elemi!=#)coutBT.elemi);A AB BC CD D
23、E EF FGGHHI IJ JKK本讲稿第二十二页,共一百一十六页23二叉树用链式存储结构表示时,按层遍历的算法实现访问过程描二叉树用链式存储结构表示时,按层遍历的算法实现访问过程描二叉树用链式存储结构表示时,按层遍历的算法实现访问过程描二叉树用链式存储结构表示时,按层遍历的算法实现访问过程描述如下:述如下:述如下:述如下:(1)(1)访问根结点,并将该结点记录下来;访问根结点,并将该结点记录下来;访问根结点,并将该结点记录下来;访问根结点,并将该结点记录下来;(2)(2)若记录的所有结点都已处理完毕,则结束遍历操作;否则若记录的所有结点都已处理完毕,则结束遍历操作;否则若记录的所有结点都已
24、处理完毕,则结束遍历操作;否则若记录的所有结点都已处理完毕,则结束遍历操作;否则重复下列操作。重复下列操作。重复下列操作。重复下列操作。(3)(3)取出记录中第一个还没有访问孩子的结点,若它有左孩子,取出记录中第一个还没有访问孩子的结点,若它有左孩子,取出记录中第一个还没有访问孩子的结点,若它有左孩子,取出记录中第一个还没有访问孩子的结点,若它有左孩子,则访问左孩子,并将记录下来;若它有右孩子,则访问右孩子,则访问左孩子,并将记录下来;若它有右孩子,则访问右孩子,则访问左孩子,并将记录下来;若它有右孩子,则访问右孩子,则访问左孩子,并将记录下来;若它有右孩子,则访问右孩子,并记录下来。并记录下
25、来。并记录下来。并记录下来。在这个算法中,应使用一个在这个算法中,应使用一个队列队列队列队列结构完成这项操作。所谓记录结构完成这项操作。所谓记录结构完成这项操作。所谓记录结构完成这项操作。所谓记录访问结点就是入队操作;而取出记录的结点就是出队操作。访问结点就是入队操作;而取出记录的结点就是出队操作。访问结点就是入队操作;而取出记录的结点就是出队操作。访问结点就是入队操作;而取出记录的结点就是出队操作。本讲稿第二十三页,共一百一十六页24这样一来,这样一来,这样一来,这样一来,算法就可以描述成下列形式:算法就可以描述成下列形式:算法就可以描述成下列形式:算法就可以描述成下列形式:(1)访问根结点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 递归 算法 精选 文档

限制150内