中国大学MOOC-陈越、何钦铭-数据结构-2015秋 03-树3 Tree Traversals Again (25分)

来源:互联网 发布:模拟炒股软件手机版 编辑:程序博客网 时间:2024/05/29 13:02

题目传送门~

   这道题的本意是给定一颗二叉树的先序和中序序列,如何得到这颗二叉树的后序遍历序列,这个问题已经很古老了,然而今天是第一次写,想通了遍历的原理,很容易写出递归版本的求后序序列的函数,至于先序和中序可以从给定的数据获得,即push代表就是先序,pop代表的是中序,不懂请call陈越姥姥。
   先给出递归版本求后序遍历的递归函数版本。   void Build(int *pre,int *in,int n){    if(n==0)    {        return ;    }    int i;    int c=pre[0];    for(i=0;i<n;i++)    {        if(c==in[i])            break;    }    Build(pre+1,in,i);///pre+1代表左子树的头结点,i代表左子树的长度,in代表中序左子树的头结点    Build(pre+i+1,in+i+1,n-i-1);///pre+i+1代表右子树的根,n-i-1代表右子树的长度,in+i+1代表中序右子树的头结点    q.push(pre[0]);}

下面再给出本题的ac代码

///此题还可以简化,自己可以试一试,不用堆栈的解法。/// @author just_sort/// 2015/9/24 10:43/// water~#include<cstdio>#include<cstring>#include<vector>#include<set>#include<cmath>#include<queue>#include<stack>#include<algorithm>#include<ctype.h>#include<cstdlib>#include<iostream>using namespace std;typedef long long LL;#define lowbit(x) x&(-x)#define INF 0x7fffffff#define UNF -9999999typedef long long LL;/*****I am swimming*****/queue<int>q;int pre[35],in[35];void Build(int *pre,int *in,int n);int main(){    string ss;    int n;    stack<int>s;    cin>>n;    n*=2;    int cnt1=0,cnt2=0;    for(int i=0;i<n;i++)    {       cin>>ss;       if(ss=="Push")       {           scanf("%d",&pre[cnt1]);           s.push(pre[cnt1++]);       }       else       {           in[cnt2++]=s.top();           s.pop();       }    }    ///已知先序和中序,求后序    Build(pre,in,n/2);    printf("%d",q.front());    q.pop();    while(!q.empty())    {        printf(" %d",q.front());        q.pop();    }    //system("pause");    return 0;}void Build(int *pre,int *in,int n){    if(n==0)    {        return ;    }    int i;    int c=pre[0];    for(i=0;i<n;i++)    {        if(c==in[i])            break;    }    Build(pre+1,in,i);///pre+1代表左子树的头结点,i代表左子树的长度,in代表中序左子树的头结点    Build(pre+i+1,in+i+1,n-i-1);///pre+i+1代表右子树的根,n-i-1代表右子树的长度,in+i+1代表中序右子树的头结点    q.push(pre[0]);}
0 0
原创粉丝点击