105-Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal
0x0 题目详情
0x1 解题思路
0x2 代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null || inorder==null || preorder.length==0 || inorder.length==0){
return null;
}
//key为当前值,value为下标
Map<Integer,Integer> indexMap=new HashMap<>();
for(int i=0;i<inorder.length;i++){
indexMap.put(inorder[i],i);
}
return recur(preorder,indexMap,0,preorder.length,0,inorder.length);
}
//区间采取左闭右开的方式
private TreeNode recur(int[] preorder,Map<Integer,Integer> indexMap,int preBegin,int preEnd,int inBegin,int inEnd){
if(preBegin>=preEnd){
return null;
}
TreeNode root=new TreeNode(preorder[preBegin]);
int pivot=indexMap.get(preorder[preBegin]);
//计算左子树区间长度
int leftLength=pivot-inBegin;
//计算右子树区间长度
int rightLength=inEnd-pivot-1;
//先构建左子树
root.left=recur(preorder,indexMap,preBegin+1,preBegin+1+leftLength,inBegin,pivot);
//再构建右子树
root.right=recur(preorder,indexMap,preBegin+1+leftLength,preBegin+1+leftLength+rightLength,pivot+1,inEnd);
return root;
}
}0x3 课后总结
Last updated