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