二叉树已知先序中序求后序,已知后序中序求先序

来源:互联网 发布:神机妙算软件安装流程 编辑:程序博客网 时间:2024/05/22 12:54

已知先序中序求后序

public class BinaryTree1 {    private Node root;    public void postOrder(){        postOrder(root);    }    //二叉树构造完毕之后进行后续遍历    private void postOrder(Node localroot) {        if(localroot!=null){            postOrder(localroot.left);            postOrder(localroot.right);            System.out.print(localroot.data+" ");        }    }    public void InitTree(int[] preOrder,int[] inOrder){        this.root=InitTree(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);    }    /**     *     * @param preOrder 先序遍历的数组     * @param start1 递归每次遍历的数据段在先序遍历数组中的起始位置     * @param end1 递归每次遍历的数据段在先序遍历数组中的终止位置     * @param inOrder 中序遍历的数组     * @param start2 递归每次遍历的数据段在中序遍历数组中的起始位置     * @param end2 递归每次遍历的数据段在中序遍历数组中的终止位置     * @return 返回本次递归所构造完毕的树的根节点(从子结点向上依次返回)     */    private Node InitTree(int[] preOrder, int start1, int end1, int[] inOrder, int start2, int end2) {        if(start1>end1||start2>end2){            return null;        }        int rootData=preOrder[start1];        Node head=new Node(rootData);        int rootindex=findIndexInArray(inOrder,rootData,start2,end2);        /**         * offset为以本次递归构造的节点为根节点的左子树的节点个数         */        int offset=rootindex-start2-1;        Node left=InitTree(preOrder,start1+1,start1+offset+1,inOrder,start2,start2+offset);        Node right=InitTree(preOrder,start1+offset+2,end1,inOrder,rootindex+1,end2);        head.left=left;        head.right=right;        return head;    }    //检索出递归方法每次构造的节点在中序遍历数组中的索引    public int  findIndexInArray(int[] a,int x,int begin,int end){        for (int i = begin; i <=end; i++) {            if(a[i]==x){                return i;            }        }        return -1;    }    public static void main(String[] args) {        BinaryTree1 biTree=new BinaryTree1();        int[] preOrder={2,1,8,7,4,3,6,5,7,9};        int[] inorder={1,2,3,4,5,6,7,7,8,9};        biTree.InitTree(preOrder,inorder);        System.out.println("后序遍历");        biTree.postOrder();    }}

解释:假设先序数组A B D E C F 中序数组D B E A F C

这里写图片描述

已知中序后序求先序

public class BinaryTree2 {    private Node root;    public void preOrder(){        preOrder(root);    }    private void preOrder(Node localroot) {        if(localroot!=null){            System.out.print(localroot.data+" ");            preOrder(localroot.left);            preOrder(localroot.right);        }    }    public void initTree(int[] inOrder,int[] postOrder){        this.root=initTree(inOrder,0,inOrder.length-1,postOrder,0,postOrder.length-1);    }    private Node initTree(int[] inOrder, int start1, int end1, int[] postOrder, int start2, int end2) {        if(start1>end1||start2>end2){            return null;        }        int rootdata=postOrder[end2];        Node head=new Node(rootdata);        int rootindex=findIndexInArray(inOrder,rootdata,start1,end1);        int offset=rootindex-1-start1;        Node left=initTree(inOrder,start1,start1+offset,postOrder,start2,start2+offset);        Node right=initTree(inOrder,rootindex+1,end1,postOrder,start2+offset+1,end2-1);        head.left=left;        head.right=right;        return head;    }    public int  findIndexInArray(int[] a,int x,int begin,int end){        for (int i = begin; i <=end; i++) {            if(a[i]==x){                return i;            }        }        return -1;    }    public static void main(String[] args) {        BinaryTree2 biTree=new BinaryTree2();        int[] inorder={1,2,3,4,5,6,7,7,8,9};        int[] postOrder={1,3,5,6,4,7,7,9,8,2 };        biTree.initTree(inorder,postOrder);        System.out.println("先序遍历");        biTree.preOrder();    }}

解释同上。。。。。。

阅读全文
0 0