题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805380754817024
代码逻辑
本人的代码逻辑,是通过栈的push和pop建立一颗树,并对树做后序遍历
参考的代码逻辑,则是栈本身的进出逻辑符合左根右的中序遍历,而push的顺序则符合根左右的前序遍历。在得到前序序列和中序序列后,结合二者转为后序即可
AC代码
本人代码
#include<bits/stdc++.h>
using namespace std;
struct Node{
int left=-1,right=-1;
}node[35];
stack<int> st;
int n,last=-1,root,flag=1;
void post_order(int root)
{
if(node[root].left!=-1) post_order(node[root].left);
if(node[root].right!=-1) post_order(node[root].right);
if(flag) flag=0;
else cout<<" ";
cout<<root;
}
int main()
{
cin>>n;
getchar();
n*=2;
while(n--)
{
string s,s1;
getline(cin,s);
if(s[1]=='u')
{
for(int i=5;s[i];i++)
s1+=s[i];
int num=stoi(s1);
if(last==-1)
{
st.push(num);
last=num;
root=num;
}
else
{
if(node[last].left==-1) node[last].left=num;
else node[last].right=num;
st.push(num);
last=num;
}
}
else
{
last=st.top();
st.pop();
}
}
post_order(root);
}
参考代码
#include<bits/stdc++.h>
using namespace std;
vector<int> pre,in;
stack<int> st;
int n,m,t,flag=1;
void post_order(int root,int l,int r)
{
if(l>r) return;
int i=l;
while(i<r&&in[i]!=pre[root]) i++;
post_order(root+1,l,i-1);
post_order(root+1+i-l,i+1,r);
if(flag) flag=0;
else cout<<" ";
cout<<pre[root];
}
int main()
{
cin>>n;
getchar();
m=n*2;
while(m--)
{
string s;
cin>>s;
if(s.length()==4)
{
cin>>t;
getchar();
st.push(t);
pre.push_back(t);
}
else
{
in.push_back(st.top());
st.pop();
}
}
post_order(0,0,n-1);
}