算法:二叉树前序,中序,后序,知二求一(Java代码)

算法:二叉树前序,中序,后序,知二求一(Java代码)

注意:

通过前序和中序,后序和中序都可以得到唯一一个确定的二叉树。而只知道前序和后序遍历的结果是没办法确定唯一一个二叉树的,因为可能有多种情况。所以这里为了简化问题,暂时提出一个限制条件:如果根节点只有一个子节点那么这个节点规定为左节点。

直接上代码:

public class Main {
    static ArrayList<Integer> Pre = new ArrayList<>();
    static ArrayList<Integer> In = new ArrayList<>();
    static ArrayList<Integer> Post = new ArrayList<>();
    public static void main(String[] args) {
        int n = 9;
        int[] pre = {5,3,1,8,9,2,4,6,7};
        int[] in = {8,1,9,3,2,5,6,4,7};
        int[] post = {8,9,1,2,3,6,7,4,5};

        System.out.println("Get Pre by In and Post");
        //get pre by in and post
        getPre(0,n-1,in,0,n-1,post);
        int[] resPre = new int[n];
        for(int i = 0 ;i < Pre.size(); i++){
            resPre[i] = Pre.get(i);
        }
        Print(resPre);
        System.out.println();
        System.out.println("==========================================");



        System.out.println("Get In by Pre and Post");
        //get in by pre and post(Note: if a root has only one child, we assume the child is his left child)
        getIn(0,n-1,pre,0,n-1,post);
        int[] resIn = new int[n];
        for(int i = 0 ;i < In.size(); i++){
            resIn[i] = In.get(i);
        }
        Print(resIn);

        System.out.println();
        System.out.println("==========================================");


        System.out.println("Get In by Pre and Post");
        //get Post by Pre and In
        getPost(0,n-1,pre,0,n-1,in);
        int[] resPost = new int[n];
        for(int i = 0 ;i < Post.size(); i++){
            resPost[i] = Post.get(i);
        }
        Print(resPost);

    }
    public static void getPre(int inl, int inr,int[] in, int postl, int postr,int[] post){
        if(inl > inr) return;
        if(inl == inr){
            Pre.add(in[inl]);
            return;
        }
        int index = -1;
        for (int i = inl; i <= inr; i++) {
            if(post[postr]==in[i]) index = i;
        }
        Pre.add(post[postr]);
        getPre(inl,index-1,in,postl,postl+index-1-inl,post);
        getPre(index+1,inr,in,postl+index-inl,postr-1,post);
    }


    public static void getIn(int pl, int pr, int[] pre, int sl, int sr, int[] suf){
        if(pl>pr) return;
        if(pl == pr){
            In.add(pre[pl]);
            return;
        }
        int pos = -1;
        for(int i = sl; i <= sr;i++){
            if(pre[pl+1] == suf[i]) pos = i;
        }
        getIn(pl+1,pos-sl+pl+1,pre,sl,pos,suf);
        In.add(pre[pl]);
        getIn(pos-sl+pl+2,pr,pre,pos+1,sr-1,suf);
    }


    public static void getPost(int prel, int prer, int[] pre, int inl, int inr, int[] in){
        if(prel>prer) return;
        if(prel==prer){
            Post.add(pre[prer]);
            return;
        }

        int index = -1;
        for(int i = inl; i<=inr; i++){
            if(pre[prel]==in[i]) index = i;
        }
        getPost(prel+1,prel+index-inl,pre,inl,index-1,in);
        getPost(prel+index-inl+1,prer,pre,index+1,inr,in);
        Post.add(pre[prel]);
    }

    public static void Print(int[] a){
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
    }
}

本文为作者原创,有何问题可以在评论区留言,欢迎大家指正和交流!!!!

猜你喜欢

转载自blog.csdn.net/m0_49580032/article/details/107859157
今日推荐