这个题的思路是和根据中前遍历重建二叉树类似的。因为后续遍历的最后一个元素总是根节点,那么只需要先找到后序遍历中的根节点,再把数组分为左右两个区间就能找到左子树与右子树。
public class Solution {
public TreeNode buildTree (int[] inorder, int[] postorder) {
if(postorder.length==0)return null;
TreeNode root = new TreeNode(postorder[postorder.length-1]);
for(int i=0;i<inorder.length;++i){
if(root.val==inorder[i]){
root.left = buildTree(
Arrays.copyOfRange(inorder,0,i),
Arrays.copyOfRange(postorder,0,i)
);
root.right = buildTree(
Arrays.copyOfRange(inorder,i+1,inorder.length),
Arrays.copyOfRange(postorder,i,inorder.length-1)
);
return root;
}
}
return root;
}
}