//给中序和后序,还原二叉树
public static TreeNode buildTree(List<Integer> inOrder, List<Integer> postOrder){
if(inOrder.size()==0)
return null ;
//跟结点的值
int rootValue=postOrder.get(postOrder.size()-1);
//根据根节点的值在中序中判断左子树的结点个数
int leftCount=inOrder.indexOf(rootValue);
//把中序,后序的左子树分割出来
List<Integer> leftInorder=inOrder.subList(0,leftCount);
List<Integer> leftPostOrder=postOrder.subList(0,leftCount);
//把中序,后序的右子树分割出来
List<Integer> rightInOrder=inOrder.subList(leftCount+1,inOrder.size());
//后序的根节点已经算过了
List<Integer> rightPostOrder=postOrder.subList(leftCount,inOrder.size()-1);
TreeNode root=new TreeNode();
root.val=rootValue;
root.left=buildTree(leftInorder,leftPostOrder);
root.right=buildTree(rightInOrder,rightPostOrder);
return root;
}
//给你前序和中序,还原二叉树
public static TreeNode buildTree2(List<Integer> perOrder,List<Integer> inOrder){
if(perOrder.size()==0){
return null;
}
int rootValue=perOrder.get(0);
int leftCount=inOrder.indexOf(rootValue);
List<Integer> leftPerOrder=perOrder.subList(1,1+leftCount);
List<Integer> leftInOrder=inOrder.subList(0,leftCount);
List<Integer> rightPerOrder=perOrder.subList(leftCount+1,perOrder.size());
List<Integer> rightInOrder=inOrder.subList(leftCount+1,inOrder.size());
TreeNode root=new TreeNode();
root.val=rootValue;
root.left=buildTree(leftInOrder,leftPerOrder);
root.right=buildTree(leftInOrder,leftPerOrder);
return root;
}