PAT 1086. 再次树遍历
原题链接
简单
作者:
YAX_AC
,
2024-11-28 19:35:13
,
所有人可见
,
阅读 5
//non-recursive非递归 postorder traversal后序遍历
//用栈模拟实现中序遍历
//Push操作的数据过程是先序遍历,Pop操作的数据过程是中序遍历
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<sstream>
#include<stack>
using namespace std;
const int N = 40;
int n;
vector<int> preorder,inorder,postorder;
stack<int> st;
void build(int inL, int inR, int preL,int preR)//建树
{
if(inL>inR) return;
int root=preorder[preL];
int k;
for(k=inL;k<=inR;k++)
{
if(inorder[k]==root)
{
build(inL,k-1,preL+1,preL+k-inL);
build(k+1,inR,preL+k-inL+1,preR);
postorder.push_back(root);
}
}
}
int main()
{
cin>>n;
string str;
getline(cin,str);
for(int i = 0; i<n*2; i++)
{
getline(cin,str);
stringstream ss(str);
string a,b;
ss>>a>>b;
if(a == "Push")//Push顺序就是前序遍历
{
preorder.push_back(stoi(b));
st.push(stoi(b));
}
else//pop出来模拟的是中序遍历
{
inorder.push_back(st.top());
st.pop();
}
}
build(0,n-1,0,n-1);
for(int i=0;i<n;i++)
{
if(i==0) printf("%d",postorder[i]);
else printf(" %d",postorder[i]);
}
return 0;
}