来源:力扣(LeetCode)
链接:OJ链接
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例 2:
输入:inorder = [-1], postorder = [-1]
输出:[-1]
提示:
1 <= inorder.length <= 3000
postorder.length == inorder.length
-3000 <= inorder[i], postorder[i] <= 3000
inorder 和 postorder 都由 不同 的值组成
postorder 中每一个值都在 inorder 中
inorder 保证是树的中序遍历
postorder 保证是树的后序遍历
class Solution {
public int postIndex=0;
public TreeNode createTreeByPandI(int[] inorder,int[] postorder,int inbegin,int inend){
if(inbegin>inend){
//如果满足这个条件,说明没有左树和右树
return null;
}
TreeNode root=new TreeNode(postorder[postIndex]);
//找到根在中序遍历的位置
int rootIndex=findIndexOfI(inorder,inbegin,inend,postorder[postIndex]);
if(rootIndex==-1){
return null;
}
postIndex--;
//分别创建右子树和左子树
root.right=createTreeByPandI(inorder,postorder,rootIndex+1,inend);
root.left=createTreeByPandI(inorder,postorder,inbegin,rootIndex-1);
return root;
}
private int findIndexOfI(int[] inorder,int inbegin,int inend,int key){
for(int i=inbegin;i<=inend;i++){
if(inorder[i]==key){
return i;
}
}
return -1;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder==null||inorder==null) return null;
postIndex=postorder.length-1;
return createTreeByPandI(inorder,postorder,0,inorder.length-1);
}
}