题目:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
解决办法:
package test;
import java.util.HashMap;
import java.util.Map;
public class LC106Try1
{
public TreeNode buildTree(int[] inorder, int[] postorder)
{
Map<Integer, Integer> inorderHash = new HashMap<Integer, Integer>();
for (int i = 0; i < inorder.length; i++) {
inorderHash.put(inorder[i], i);
}
TreeNode node = getPass(inorderHash,postorder,0,inorder.length-1,0,postorder.length-1);
return node;
}
public TreeNode getPass(Map<Integer, Integer> inorderHash, int[] postorder,int s1,int e1,int s2,int e2){
if(s1>e1||e2<0){
return null;
}
TreeNode root= new TreeNode(postorder[e2]);
int k=inorderHash.get(postorder[e2]);
int leftlen=k-s1;
root.left=getPass(inorderHash,postorder,s1,k-1,s2,s2+leftlen-1);
root.right=getPass(inorderHash,postorder,k+1,e1,s2+leftlen,e2-1);
return root;
}
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder.length==0){
return null;
}
int tag=0;
int len=postorder.length-1;
for(int i=0;i<inorder.length;i++){
if(postorder[len]==inorder[i]){
tag=i;
break;
}
}
TreeNode root=new TreeNode(postorder[len]);
if(tag>0){
int[] leftInorder = new int[tag];
int[] leftPostorder = new int[tag];
for(int i=0;i<tag;i++){
leftInorder[i]=inorder[i];
leftPostorder[i]=postorder[i];
}
root.left=buildTree(leftInorder,leftPostorder);
}
if(inorder.length-tag-1>0){
int[] rightInorder = new int[inorder.length-tag-1];
int[] rightPostorder = new int[inorder.length-tag-1];
for(int i=0;i<inorder.length-tag-1;i++){
rightInorder[i]=inorder[tag+i+1];
rightPostorder[i]=postorder[tag+i];
}
root.right=buildTree(rightInorder,rightPostorder);
}
return root;
}
哈哈