第1页共14页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共14页如何用栈实现递归与非递归的转换一
为什么要学习递归与非递归的转换的实现方法
1)并不是每一门语言都支持递归的
2)有助于理解递归的本质
3)有助于理解栈,树等数据结构
递归与非递归转换的原理
递归与非递归的转换基于以下的原理:所有的递归程序都可以用树结构表示出来
需要说明的是,这个"原理"并没有经过严格的数学证明,只是我的一个猜想,不过在至少在我遇到的例子中是适用的
学习过树结构的人都知道,有三种方法可以遍历树:前序,中序,后序
理解这三种遍历方式的递归和非递归的表达方式是能够正确实现转换的关键之处,所以我们先来谈谈这个
需要说明的是,这里以特殊的二叉树来说明,不过大多数情况下二叉树已经够用,而且理解了二叉树的遍历,其它的树遍历方式就不难了
1)前序遍历a)递归方式:[code:1:1f2a39cc2d]voidpreorder_recursive(BitreeT)/*先序遍历二叉树的递归算法*/{if(T){visit(T);/*访问当前结点*/preorder_recursive(T->lchild);/*访问左子树*/preorder_recursive(T->rchild);/*访问右子树*/}}[/code:1:1f2a39cc2d]b)非递归方式[code:1:1f2a39cc2d]voidpreorder_nonrecursive(BitreeT)/*先序遍历二叉树的非递归算法*/{initstack(S);push(S,T);/*根指针进栈*/第2页共14页第1页共14页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共14页while(
stackempty(S)){while(gettop(S,p)&&p){/*向左走到尽头*/vis