剑指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);

    }
}
发布了117 篇原创文章 · 获赞 8 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u014257192/article/details/58250267