106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.HashMap;
import java.util.Map;

class Solution {

    private Map<Integer, Integer> inOrderMap = new HashMap<>();

    private TreeNode solve(int[] postorder, int postStart, int postEnd, int inStart, int inEnd) {
        if (postStart > postEnd) {
            return null;
        }
        TreeNode root = new TreeNode(postorder[postEnd]);

        int pos = inOrderMap.get(root.val);

        int leftLength = pos - inStart;
        int rightLength = inEnd - pos;

        root.left = solve(postorder, postStart, postStart + leftLength - 1, inStart, pos - 1);
        root.right = solve(postorder, postStart + leftLength, postEnd - 1, pos + 1, inEnd);

        return root;
    }

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if (inorder == null || inorder.length == 0 || postorder == null || postorder.length == 0 || inorder.length != postorder.length) {
            return null;
        }
        for (int i = 0; i < inorder.length; ++i) {
            inOrderMap.put(inorder[i], i);
        }
        return solve(postorder, 0, postorder.length - 1, 0, inorder.length - 1);
    }
}


class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {
    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
posted @ 2021-12-15 21:38  Tianyiya  阅读(30)  评论(0)    收藏  举报