- 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;
 
 - }
 
  
 
  复制代码 |   
 
 
 
 |