天梯赛练习——7-6 Tree Traversals Again (25分)(前序+中序->后序)

题目:

在这里插入图片描述

分析:

从题目分析可知,入栈的顺序即为树的前序遍历,出栈的顺序即为树的中序遍历,分别使用数组pre,mid存储前序和后序遍历的结果,随后根据前序和后序的遍历结果即可求出后序遍历

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <stack>
#include <vector>
using namespace std;

int n,ind,indx,ii;
int mid[35],pre[35];
string str;
vector<int> pos;

void PostOrder(int root,int st,int ed)  //root是对于前序数组pre ,st、ed是对于中序数组 mid
{
    if(st > ed) return;
    int index=st;
    while(st<ed&&pre[root]!=mid[index]) index++;
    PostOrder(root+1,st,index-1);
    PostOrder(root+1+index-st,index+1,ed);
    pos.push_back(pre[root]);
}

int main()
{
    int val;
    stack<int> s;
    scanf("%d",&n);
    int tmp = 2*n;
    while(tmp--)
    {
        cin >> str;
        if(str[1]=='u')
        {
            scanf("%d",&val);
            pre[indx++] = val;  //前序
            s.push(val);
        }
        if(str[1]=='o')
        {
            mid[ind++] = s.top();  //中序
            s.pop();
        }
    }
    PostOrder(0,0,n-1);
    for(unsigned i=0;i<pos.size();++i)
        if(i==pos.size()-1)
            printf("%d\n",pos[i]);
        else
            printf("%d ",pos[i]);
    return 0;
}
发布了61 篇原创文章 · 获赞 7 · 访问量 3947
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览