PAT甲级1086 Tree Traversals Again 有解析,看完应该就会了

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;
    }
}

如果还有看不懂的请访问:已知先中序求后序,已知后中序求先序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值