主题思想: 这题和105 姊妹题,主要思想就是递归,然后利用中序遍历的特点,后序遍历的特点,把原数组,利用起始下标的不同,分割成左右子树,两段,然后递归构造左子树,和右子树。
具体AC 代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
HashMap<Integer,Integer> mapIndex=new HashMap<Integer,Integer>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(inorder==null||postorder==null||inorder.length!=postorder.length) return null;
//remember the element's index of inorder.
for(int i=0;i<inorder.length;i++) mapIndex.put(inorder[i],i);
return build(inorder,postorder,0,inorder.length-1,0,postorder.length-1);
}
public TreeNode build(int[] inorder,int [] postorder,int inStart,int inEnd,int postStart,int postEnd){
if(inStart>inEnd||postStart>postEnd) return null;
TreeNode root=new TreeNode(postorder[postEnd]);
int rootIndex=mapIndex.get(postorder[postEnd]);
root.left=build(inorder,postorder,inStart,rootIndex-1,postStart,postStart+rootIndex-inStart-1);
root.right=build(inorder,postorder,rootIndex+1,inEnd,postStart+rootIndex-inStart,postEnd-1);
return root;
}
}