根据两种遍历顺序重构树

1. 先序 + 中序

public TreeNode buildTree(int[] preorder, int[] inorder) {
    
    if (preorder == null || inorder == null || preorder.length != inorder.length) return null;
    
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < inorder.length; i++) map.put(inorder[i], i);
    
    return helper(preorder, 0, preorder.length - 1, map, 0, inorder.length - 1);
    
}

private TreeNode helper(int[] preorder, int pb, int pe, Map<Integer, Integer> map, int ib, int ie) {
    
    if (pb > pe || ib > ie) return null;
    
    TreeNode root = new TreeNode(preorder[pb]);
    int ci = map.get(preorder[pb]);
    
    root.left = helper(preorder, pb + 1, pb + ci - ib, map, ib, ci - 1);
    root.right = helper(preorder, pb + ci -ib + 1, pe, map, ci + 1, ie);
    
    return root;
    
}

2. 中序 + 后序

public TreeNode buildTree(int[] inorder, int[] postorder) {

    if (inorder == null || postorder == null || inorder.length != postorder.length) return null;

    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < inorder.length; i++) map.put(inorder[i], i);

    return helper(map, 0, inorder.length - 1, postorder, 0, postorder.length - 1);

}

private TreeNode helper(Map<Integer, Integer> map, int ib, int ie, int[] postorder, int pb, int pe) {

    if (ib > ie || pb > pe) return null;

    TreeNode root = new TreeNode(postorder[pe]);
    int ci = map.get(postorder[pe]);

    root.left = helper(map, ib, ci - 1, postorder, pb, pe - ie + ci - 1);
    root.right = helper(map, ci + 1, ie, postorder, pe - ie + ci, pe - 1);

    return root;

}

3. 先序 + 后序

4. 先序 + 二叉搜索树

最后更新于

这有帮助吗?