和LeetCode-105是相同的原理,这次只需要将后续遍历序列从后向前遍历,这道题的关键是递归时参数的设定要想清楚
public class ConstructBinaryTreefromInorderandPostorderTraversa {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
return assistBuildTree(inorder,0,inorder.length - 1,postorder,0,postorder.length - 1);
}
public TreeNode assistBuildTree(int[] inorder,int ibegin,int iend,int[] postorder,int pbegin,int pend){
if (pbegin > pend) {
return null;
}
int povit = postorder[pend];
//在中序遍历中找到povit的位置
int i = ibegin;
for(;i <= iend;i ++){
if(inorder[i] == povit){
break;
}
}
int rightLength = iend - i;
TreeNode root = new TreeNode(povit);
//这个参数必须理清楚,理清楚!
root.right = assistBuildTree(inorder, i + 1, iend, postorder, pend - rightLength, pend - 1);
root.left = assistBuildTree(inorder, ibegin, i - 1, postorder, pbegin, pend - rightLength - 1);
return root;
}
}