二叉树的三种遍历的相互转化——已知先序中序求后序
来源:互联网 发布:电信诈骗套路 知乎 编辑:程序博客网 时间:2024/04/29 17:39
来自http://blog.csdn.net/huangxy10/article/details/8010698
题目:
已知二叉树的先序和中序遍历字符串,编程实现输出后序遍历字符串,
如果没有成功输出Failed,最后分析时间和空间复杂度。
题目来源:
经典题目,也是网易游戏2011年游戏开发工程师的一道笔试题。
分析:
二叉树的题目基本上都是要用递归的,这题也一样。
而递归的核心是找到结构相同的子问题。
二叉树如下所示:
a
↙ ↘
b c
↙↘ ↘
d e g
前序: abdecg
中序: dbeacg
由前序的第一个a,可以把树分为两个部分,左子树和右子树。
在中序序列中找到a,左边部分则是左子树的中序,右边则是右子树的中序,
同样前序a的后面紧跟着左子树的前序和右子树的前序。
则问题可分解为两个结构相同的小问题。
1,先求左子树的后序;
2,求右子树的后序;
3,再将左子树和右子树的后序串起来,最后加上本身节点即可。
代码:
- #include <string>
- #include <iostream>
- using namespace std;
- string FindPostOrder( string pre_order, string in_order );
- int _tmain(int argc, _TCHAR* argv[])
- {
- string pre_order, in_order, post_order;
- cin >> pre_order >> in_order;
- cout << FindPostOrder( pre_order, in_order );
- return 0;
- }
- string FindPostOrder( string pre_order, string in_order )
- {
- if( pre_order.length() != in_order.length() ) //前序中序元素个数不相等出错
- {
- cout << "Failed" << endl;
- exit(1);
- }
- if( pre_order.length() == 1 ) //递归终止
- {
- if( pre_order != in_order ) //一个元素时前序中序不相等
- {
- cout << "Failed" <<endl;
- exit(1);
- }
- return pre_order;
- }
- if( pre_order.length() == 0) //前序为空时,后序也为空
- return string();
- char node = pre_order[0]; //取第一个元素
- int index = in_order.find( node ); //找到其在中序中的位置
- if( index == string::npos ) //没有找到,则出错
- {
- cout << "Failed" <<endl;
- exit(1);
- }
- int len = pre_order.length();
- //左子树的后序
- string left_part = FindPostOrder( pre_order.substr(1,index), in_order.substr(0,index) );
- //右子树的后序
- string right_part = FindPostOrder( pre_order.substr(1+index, len-index-1), in_order.substr(1+index,len-index-1) );
- return left_part+right_part+node; //串联起来
- }
0 0
- 二叉树的三种遍历的相互转化——已知先序中序求后序
- 二叉树的三种遍历的相互转化——已知先序中序求后序
- 学习笔记——已知二叉树的先序中序求后序、中序后序求先序的遍历序列
- 已知两种二叉树的遍历,求第三种
- 已知二叉树的两种遍历序列重建树
- 二叉树的相互求解 已知前序中序求后序 已知后序前序求中序 已知前序后序求中序
- 二叉树(三)——已知遍历序列构造二叉树(java版)
- 二叉树面试题--已知二叉树的两种遍历序列,求出另一种遍历序列
- 二叉树面试题--已知二叉树的两种遍历序列,求出另一种遍历序列
- 二叉树-根据已知的遍历顺序还原二叉树
- 已知二叉树的前序遍历和中序遍历求后序遍历(二叉树)
- 已知二叉树的后序遍历和中序遍历求前序遍历(二叉树)
- 二叉树系列:已知二叉树的中序遍历和前序遍历,求后序遍历
- 已知二叉树的前序遍历和中序遍历重建二叉树(二叉树)
- 已知二叉树的后序遍历和中序遍历重建二叉树(二叉树)
- 已知二叉树的先序和中序求后序遍历
- SOJ-2664(已知满二叉树的后序求中序遍历)
- 已知二叉树的先序和中序求后序遍历
- Android Xutils 开发框架
- 艾玛迪斯咨询讨论定价的iPhone应用程序的最大的成功
- getline()函数的详解
- ViewPage滑动冲突解决办法
- Js获取当前日期时间及其它操作
- 二叉树的三种遍历的相互转化——已知先序中序求后序
- 算法之--数组分割
- jQuery遍历函数
- Reactor模式和NIO
- 艾玛迪斯咨询讨论了跨平台的应用程序开发的iPhone,Android,黑莓和Windows Phone 7
- python核心编程--第十章 11.11 练习
- 艾玛迪斯咨询讨论iPad应用程序开发业务
- NBUT 1225 NEW RDSP MODE I
- 服务器×××上的MSDTC不可用