递归转换成非递归思路
来源:互联网 发布:数据库序列如何创建 编辑:程序博客网 时间:2024/05/01 19:31
问题:
非常经典的问题,将一个二叉树遍历,前序,中序,后序遍历由递归转换成非递归。
分析:
递归转换成非递归,一般解法是自己使用栈去模拟递归过程,首先我们来看下后序遍历递归解法:
void postOrderTraverse(pNode root)
{
if(root == NULL)
return ;
postOrderTraverse(p->left);
postOrderTraverse(p->right);
visit(p);
return ;
}
从上面递归过程可以看出来,首先是从左子树一直递归下去,知道为空,然后从栈中返回一个节点,再从这个节点的右节点进行遍历,最后才访问根节点,这里后序遍历的非递归算法,需要一个小trick,p自身需要做个标记,标记当前的右节点是否已经遍历,如果没有遍历,执行右节点任务,如果已经执行,可以访问自己。
代码如下:
void PostTraverse(BINARYTREE p){while (p != NULL || !Stack.IsEmpty()) //存在工作(手头或待完成) {while (p != NULL) //处理手头工作,直到无现成手头工作 {Stack.Push(p, RCHILD_AND_ITSELF);p = p->LChild;}if (!Stack.IsEmpty()) //是否存在待完成工作 {Stack.Pop(p, Tag);if (Tag == RCHILD_AND_ITSELF) //情况一: RChild & Itself {Stack.Push(p, ONLY_ITSELF)//保存待完成工作 p = p->RChild; //新的手头工作 }else //tag == ONLY_ITSELF, 情况二: Only Itself {visit(p);p = NULL; //已无现成的手头工作 }}}}
总结:
从上面代码可以看出,递归转换成非递归,我们需要使用栈来模拟。
用一个指针变量保存当前执行的任务,p
用一个栈保存将要执行的任务,Stack
如果p为NULL了,说明当前手头没有任务,我们需要从Stack中选择一个任务,如果Stack为空,说明当前所有任务都已经完成
理解了手头任务和待完成任务,自行用栈模拟就比较好理解、实现了。
- 递归转换成非递归思路
- 递归算法转换成非递归算法
- 递归与非递归转换
- 二叉树非递归思路
- 递归程序转换成非递归程序的一般方法
- 关于“递归”与“非递归”的转换
- 关于“递归”与“非递归”的转换
- 递归算法转换为非递归算法
- 递归到非递归的转换
- 递归算法向非递归算法转换
- 递归算法转换为非递归算法
- 递归算法向非递归算法转换
- 递归算法向非递归算法转换
- 递归与非递归及其相互转换
- 递归算法转换为非递归算法
- 递归算法转换为非递归算法
- 递归函数转换为非递归函数
- 递归与非递归相互转换
- 开启新一片蓝海——异构计算完全解析
- java 转换xml json
- 异构平台对比(GPU FPGA DSP)
- 人老后才学摄影
- 再谈异构计算CPU+GPU
- 递归转换成非递归思路
- Dom4j下载及使用Dom4j读写XML简介
- char与int转化
- Emacs下日程管理GTD
- java中使用Dom4j修改xml文件【转】
- Eclipse Java注释模板设置详解[转载]
- 李长春致信祝贺莫言获诺贝尔文学奖-李长春-莫言-诺贝尔文学奖
- Unity动态加载和内存管理(三合一)。。。好强悍。。。
- 使用的vim(gvim)相关插件整理