POJ2255-递归
2016-05-11 10:39
441 查看
/* poj2255-给出二叉树的先序遍历和中序遍历,求后序遍历 reference: 1. http://blog.csdn.net/cbs612537/article/details/8530294 2. http://blog.csdn.net/mtawaken/article/details/7352328 解题思路: 用迭代的思想,先序遍历的第一个为根节点,将中序遍历分为左右子树。递归调用, 用不同的函数递归出口会不一样,因此递归出口应该根据递归函数的具体情况来确定. 心得: 脑子不够用,对递归还是不能好好利用,要练习。 递归的关键在于将问题划分为规模小的子问题然后确定递归的出口,在递归出口根据设计的递归函数来确定。 MakeTree函数是对中序遍历的数组划分,前后两部分作为子问题,继续调用MakeTree。这种情况下,当中序遍历的数组不存在时 应该退出。如果只 */ #include <iostream> using namespace std; char pre[27]; //先序遍历 char mid[27]; //中序遍历 int pos = -1; //先序遍历数组的下标 /* preStart,preLast为先序遍历数组的起点和终点 midStart,midLast为中序遍历数组的起点和终点 */ void MakeTree1(int preStart, int preLast, int midStart, int midLast) { char value = pre[preStart]; //先序遍历的第一个下标 int i = 0; while (mid[i] != value) //问题划分:找到中序遍历和先序遍历相等的位置,将数组分为两个 ++i; if (midStart < i) { MakeTree1(preStart + 1, preStart + i - midStart, midStart, i - 1); } if (midLast > i) { MakeTree1(preStart + i - midStart + 1, preLast, i + 1, midLast); } cout << value; //递归出口:当midStart = midLast = i时,输出 } /* i,j为中序遍历的起点和终点,每次根据先序遍历的值将中序遍历的数组分为两个数组。 */ void MakeTree(int i, int j) { int k; //划分数组的位置 if (i > j) //递归出口:当i>j该数组已经不存在 return; pos++; //每次循环,先序遍历的数组下标向后移动1 for (k = i; k < j; ++k) //找到k { if (pre[pos] == mid[k]) break; } //对划分的两个数组递归调用MakeTree MakeTree(i, k - 1); MakeTree(k + 1, j); std::cout << mid[k]; } int main(void) { while (cin >> pre >> mid) { //MakeTree(0, strlen(pre) - 1); MakeTree1(0, strlen(pre) - 1, 0, strlen(mid)-1); cout << endl; //pos = -1; } return 0; }
相关文章推荐
- apache flume agent安装
- 160510、jQuery给input绑定回车事件
- springside4技术选型
- ViewPager+PagerAdapter实现导航
- Java Web中的EL(表达式语言)详解
- 【Lua】windows下安装和使用LuaJIT步骤
- MinGW安装和使用
- 剑指offer之面试题22栈的压入、弹出序列
- 牛课网 | 选择
- NYOJ 42 一笔画问题
- Excel 集計機能
- 引用
- ElasticSearch之初识
- leetcode笔记—Reorder List
- html5 record 修改采样率导致声音无法播放解决方案
- Apache POI系列教程2-1:poi入门教程--excel百万数据的导入导出
- 算法#05--神作:深入浅出傅里叶变换
- win环境下开启apache的压缩模块
- Android4.0 Launcher拖拽原理分析
- Activity动态添加Fragment