重建二叉树

84 阅读1分钟

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

public class BuildBinaryTree {

    /***
     * 构建二叉树
     * @param pre
     * @param preStart
     * @param preEnd
     * @param in
     * @param inStart
     * @param inEnd
     * @return
     */
    public static TreeNode buildBinaryTree(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd) {
        if (null == pre && null == in) {
            return null;
        }
        TreeNode root = new TreeNode(pre[preStart]);
        if (preStart == preEnd && pre[preStart] == in[inStart]) {
            return root;
        }
        int i = inStart;
        for (; i <= inEnd; i++) {
            if (pre[preStart] == in[i]) {
                break;
            }
        }
        int leftLen = i - inStart;
        if (leftLen > 0) {
            root.left = buildBinaryTree(pre, preStart + 1, preStart + leftLen, in, inStart, i - 1);
        }
        if (leftLen < inEnd - i) {
            root.right = buildBinaryTree(pre, preStart + leftLen + 1, preEnd, in, i + 1, inEnd);
        }
        return root;
    }

    public static void main(String[] args) {
        int[] pre = new int[]{1, 2, 4, 7, 3, 5, 6, 8};
        int[] in = new int[]{4, 7, 2, 1, 5, 3, 8, 6};
        TreeNode result = buildBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
        System.out.println(result);
    }
}

class TreeNode {
    private Integer value;
    protected TreeNode left;
    protected TreeNode right;

    public TreeNode(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }
}
```