import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param inorder int整型一维数组 中序遍历序列
* @param postorder int整型一维数组 后序遍历序列
* @return TreeNode类
*/
public TreeNode buildTree (int[] inorder, int[] postorder) {
// write code here
int n = inorder.length;
TreeNode root = buildTree(inorder,postorder,0,n-1,0,n-1);
//1.postorder的末端值为根节点,利用该值在中序数组中找到根节点的位置rootIndex
//2.以rootIndex为界,inorder数组中instart至rootIndex-1是左子树,rootIndex+1至inend是右子树。
//2.以postStart+(rootIndex-inStart)为界,postorder数组中poststart至postStart+(rootIndex-inStart)-1是左子树,postStart+(rootIndex-inStart)至end-1是右子树
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder,int inStart, int inEnd, int postStart, int postEnd){
int rootIndex = inStart;
TreeNode root = new TreeNode(postorder[postEnd]);
for(int i = inStart; i <= inEnd; i++){
if(inorder[i] == postorder[postEnd]){
rootIndex = i;
break;
}
}
int offset = rootIndex-inStart;
if(inStart<rootIndex){
//说明有左子树
root.left = buildTree(inorder,postorder,inStart,rootIndex-1,postStart,postStart+offset-1);
}
if(rootIndex<inEnd){
//说明有右子树
root.right = buildTree(inorder,postorder,rootIndex+1,inEnd,postStart+offset,postEnd-1);
}
return root;
}
}