PAT甲级I086
按照题目所给的push的顺序就是先序序列的顺序,pop出栈的顺序就是中序序列的顺序
这道题要考的知识点的本质就是:已知先序和中序序列,求后序序列
和1020已知后序和中序序列求先序序列大同小异
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Stack;
public class I086 {
public static void main(String[] args) throws Exception{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int N=Integer.parseInt(br.readLine());
String[] str=new String[2*N];
for(int i=0;i<str.length;i++){
str[i]=br.readLine();
}
br.close();
Stack<Integer> stack=new Stack<>();
int[] preorder=new int[N];
int[] inorder=new int[N];
int index1=0;
int index2=0;
for(int i=0;i<str.length;i++){
if(str[i].equals("Pop")){
int vertax=stack.pop();
inorder[index1]=vertax;
index1++;
}else{
int root=Integer.parseInt(str[i].split(" ")[1]);
preorder[index2]=root;
stack.push(root);
index2++;
}
}
//至此先序和中序序列已经完全按照给定的数据建立成两个数组
I086 pat=new I086();
ArrayList<Integer> post=pat.post(inorder,preorder,0,0,N-1);
for(int i=0;i<post.size();i++){
System.out.print(post.get(i));
if(i!=post.size()-1){
System.out.print(" ");
}
}
}
Stack<Integer> stack=new Stack();
ArrayList<Integer> list=new ArrayList<>();
public ArrayList<Integer> post(int[] in,int[] pre,int root,int start,int end){
if(start>end){
return null;
}
int i=start;
while(i<end&&pre[root]!=in[i]){
i++;
}
post(in,pre,root+1,start,i-1);
post(in,pre,root-start+i+1,i+1,end);
list.add(pre[root]);
return list;
}
}
如果还有看不懂的请访问:已知先中序求后序,已知后中序求先序