给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
思路:后序二叉树的规则,左右根,因此后序数组的最后一个数就是根,所以我们直接创造根结点就行,在利用剩余数组创造子节点,因为给的函数参数只有两个数组,所以我们需要再创造一个带有其他参数的函数,这些参数能够代表分别两个数组的起始位置,即从哪到哪是中序或者后序
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
int len=inorder.length;
return myBuildTree(inorder,postorder,0,len-1,0,len-1);
}
public TreeNode myBuildTree(int[] inorder,int[] postorder,int inleft,int inright,int poleft,int poright){
if(inleft==inright) return new TreeNode(inorder[inleft]);
else if(inleft>inright||poleft>poright||inleft<0||poleft<0||inright>=inorder.length||poright>=inorder.length) return null;
int rootnum=postorder[poright];
System.out.println("inleft:"+inleft+" inright:"+inright);
System.out.println("poleft:"+poleft+" poright:"+poright);
int roottemp=0;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==rootnum){
roottemp=i;
}
}
TreeNode root=new TreeNode(rootnum);
root.left=myBuildTree(inorder,postorder,inleft,roottemp-1,poleft,poleft+(roottemp-1-inleft));
root.right=myBuildTree(inorder,postorder,roottemp+1,inright,poright-1-(inright-roottemp-1),poright-1);
return root;
}
}