劍指offer(題六)

題意:給出二叉樹前序和中序序列,要求重構該二叉樹並輸出根節點。
思路:就是由前序和中序確認該二叉樹的形狀。
代碼:

package MianShiTi_6;

public class MianShiTi_6 {
    public static class BinaryTreeNode{
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;
    }

    public static BinaryTreeNode reConstruct(int[]PreOrder , int[] inOrder) {
        if(PreOrder == null || inOrder == null || PreOrder.length != inOrder.length || PreOrder.length < 1){
            return null;
        }
        return construct(PreOrder, inOrder, 0, PreOrder.length-1, 0, inOrder.length-1);
    }

    /*
     ps:
     */
    public static BinaryTreeNode construct(int []preOrder , int []inOrder ,int ps,int pe ,int is ,int ie) {
        if(ps > pe){
            return null;
        }
        int value = preOrder[ps];
        int index = is;
        while (index < ie && inOrder[index] != value) {
            index++;
        }
        if(index > ie){
            throw new RuntimeException("invalid input"+index);
        }
        BinaryTreeNode node = new BinaryTreeNode();
        node.value = value;
        //左子樹重建,主要是這個ps+index-is的確認
        node.left = construct(preOrder, inOrder, ps+1, ps+index-is, is, index-1);
        //左子樹重建,主要是這個ps+index-is+1的確認
        node.right = construct(preOrder, inOrder, ps+index-is+1, pe, index+1, ie);
        return node;
    }

    public  static void print(BinaryTreeNode node) {
        if(node != null){
            print(node.left);
            System.out.println(node.value+" ");
            print(node.right);
        }
    }

    public static void main(String []args) {
        int[] preOrder = {1,2,4,7,3,5,6,8};
        int[] inOrder = {4,7,2,1,5,3,8,6};
        MianShiTi_6 test = new MianShiTi_6();
        BinaryTreeNode node  = reConstruct(preOrder, inOrder);
        print(node);

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章