Same idea of the former problem, only difference is that the root is located in the last position of postorder array. And the left child is in pos-(end-inorderPos) and right child is in pos: pos-1 in postorder array.

Code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    Map<Integer, Integer> inorderMap = new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int len = preorder.length;
        if(len == 0) return null;
        
        for(int i = 0; i < len; i++) inorderMap.put(inorder[i], i);
        
        return dfsAddNode(preorder, inorder, -1, len, 0);
        
    }
    
    public TreeNode dfsAddNode(int[] preorder, int[] inorder, int start, int end, int preorderPos){
        int val = preorder[preorderPos];
        TreeNode node = new TreeNode(val);
        int inorderPos = inorderMap.get(val);
        //int inorderPos = -1;
        /*
        for(int i = start+1; i < end; i++){
            if(inorder[i] == val) inorderPos = i;
        }
        */
        
        if(inorderPos == start+1) node.left = null;
        else node.left = dfsAddNode(preorder, inorder, start, inorderPos, preorderPos+1);
        if(inorderPos == end-1) node.right = null;
        else node.right = dfsAddNode(preorder, inorder, inorderPos, end, preorderPos+inorderPos-start);
        
        return node;
    }
    /*
    public int inorderPos(int[] inorder, int start, int end, int val){
        for(int i = start+1; i < end; i++){
            if(inorder[i] == val) return i;
        }
        return -1;
    }
    */
}

 

posted on 2016-01-29 09:41  爱推理的骑士  阅读(105)  评论(0编辑  收藏  举报