- UID
- 72137
注册时间2011-2-7
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
本帖最后由 Knuth学徒 于 2011-3-26 19:02 编辑
刚QQ上一个MM问我怎么写,其实就是个递归的问题,一般有两种解法,先根据先序遍历和中序遍历重新构造这棵树,然后对这棵树进行后序遍历,只是时间复杂度和空间复杂度都太高。
第二种方法就是 纯递归,在读取先序和中序的同时输出后序遍历,这样效率很高。
代码本来用C写的,但是例如 pre[30];这种太难看了……最近习惯用容器和模板库了.
- /*
- *************************
- * Auther:Knuth学徒
- * Lang : C++
- * Time : 2011-2-11
- *************************
- */
- #include<iOStream>
- #include<string>
- #include<algorithm>
- #include<cstdlib>
- using namespace std;
- void solve(string PreOrder, string InOrder)
- {
- if(PreOrder.size()== 0 || InOrder.size() == 0 )
- return ;
- char t = PreOrder[0]; //根节点
- int mid = InOrder.find(t); //在中序遍历中找出根节点
- solve(PreOrder.substr(1 , mid) , InOrder.substr (0 , mid)); //分治
- solve(PreOrder.substr(mid+1,PreOrder.size() - 1- mid ) , InOrder.substr(mid+1 , InOrder.size()- 1- mid));
- cout<<t; //输出后序遍历的根节点
- }
- int main()
- {
- string Pre;
- string In;
- cin>>Pre>>In;
- solve(Pre,In);
- cout<<endl;
- return 0;
- }
复制代码 |
|