飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3385|回复: 0

[C/C++] 二叉树已知先序遍历+中序遍历求后序遍历

[复制链接]

该用户从未签到

发表于 2011-2-11 23:09:27 | 显示全部楼层 |阅读模式
本帖最后由 Knuth学徒 于 2011-3-26 19:02 编辑

刚QQ上一个MM问我怎么写,其实就是个递归的问题,一般有两种解法,先根据先序遍历和中序遍历重新构造这棵树,然后对这棵树进行后序遍历,只是时间复杂度和空间复杂度都太高。

     第二种方法就是 纯递归,在读取先序和中序的同时输出后序遍历,这样效率很高。

    代码本来用C写的,但是例如 pre[30];这种太难看了……最近习惯用容器和模板库了.

  1. /*
  2. *************************
  3. *     Auther:Knuth学徒
  4. *     Lang : C++
  5. *     Time : 2011-2-11
  6. *************************
  7. */
  8. #include<iOStream>
  9. #include<string>
  10. #include<algorithm>
  11. #include<cstdlib>
  12. using namespace std;

  13. void solve(string PreOrder, string InOrder)
  14. {
  15.         if(PreOrder.size()== 0 || InOrder.size() == 0 )
  16.                 return ;
  17.         char t = PreOrder[0]; //根节点
  18.         int mid = InOrder.find(t);          //在中序遍历中找出根节点
  19.         solve(PreOrder.substr(1 , mid) , InOrder.substr (0 , mid));  //分治
  20.         solve(PreOrder.substr(mid+1,PreOrder.size() - 1- mid ) , InOrder.substr(mid+1 , InOrder.size()- 1- mid));

  21.         cout<<t;  //输出后序遍历的根节点
  22. }

  23. int main()
  24. {
  25.        string Pre;
  26.        string In;
  27.        cin>>Pre>>In;

  28.        solve(Pre,In);

  29.        cout<<endl;
  30.        return 0;
  31. }


复制代码
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表