重建二叉树

来源:互联网 发布:淘宝互联网生态系统 编辑:程序博客网 时间:2024/06/06 06:35

根据前序和中序,或者中序和后序,重建二叉树,递归法:

    public TreeNode buildTreeFromPreAndIn(int[] preorder, int[] inorder) {        return buildTreeFromPreAndIn(preorder, 0, preorder.length, inorder, 0, inorder.length);    }    private TreeNode buildTreeFromPreAndIn(int[] preorder, int from1, int to1, int[] inorder, int from2, int to2) {        if (from1 == to1) {            return null;        }        int val = preorder[from1];        TreeNode root = new TreeNode(val);        int leftSize = 0;        for (int i = from2; i < to2; i++) {            if (inorder[i] == val) {                break;            }            leftSize++;        }        root.left = buildTreeFromPreAndIn(preorder, from1 + 1, from1 + 1 + leftSize, inorder, from2, from2 + leftSize);        root.right = buildTreeFromPreAndIn(preorder, from1 + 1 + leftSize, to1, inorder, from2 + 1 + leftSize, to2);        return root;    }    public TreeNode buildTreeFromInAndPost(int[] inorder, int[] postorder) {        return buildTreeFromInAndPost(inorder, 0, inorder.length, postorder, 0, postorder.length);    }    private TreeNode buildTreeFromInAndPost(int[] inorder, int from1, int to1, int[] postorder, int from2, int to2) {        if (from1 == to1) {            return null;        }        int val = postorder[to2 - 1];        TreeNode root = new TreeNode(val);        int leftSize = 0;        for (int i = from1; i < to1; i++) {            if (inorder[i] == val) {                break;            }            leftSize++;        }        root.left = buildTreeFromInAndPost(inorder, from1, from1 + leftSize, postorder, from2, from2 + leftSize);        root.right = buildTreeFromInAndPost(inorder, from1 + 1 + leftSize, to1, postorder, from2 + leftSize, to2 - 1);        return root;    }


0 0