重建二叉树
public TreeNode buildTree ( int [ ] preorder, int [ ] inorder) {
if ( preorder. length == 0 || inorder. length == 0 ) return null;
int val = preorder[ 0 ] ;
int i = 0 ;
for ( ; i < inorder. length; i++ ) {
if ( inorder[ i] == val) break ;
}
TreeNode root = new TreeNode ( val) ;
root. left = buildTree ( Arrays. copyOfRange ( preorder, 1 , i + 1 ) , Arrays. copyOfRange ( inorder, 0 , i) ) ;
root. right= buildTree ( Arrays. copyOfRange ( preorder, i + 1 , preorder. length) , Arrays. copyOfRange ( inorder, i + 1 , inorder. length) ) ;
return root;
}
class Solution {
HashMap< Integer, Integer> hashMap = new HashMap < > ( ) ;
public TreeNode buildTree ( int [ ] preorder, int [ ] inorder) {
for ( int i = 0 ; i < inorder. length; i++ ) {
hashMap. put ( inorder[ i] , i) ;
}
return dfs ( preorder, inorder, 0 , preorder. length - 1 , 0 , inorder. length - 1 ) ;
}
public TreeNode dfs ( int [ ] preorder, int [ ] inorder, int pl, int pr, int il , int ir) {
if ( pl > pr) return null;
TreeNode root = new TreeNode ( preorder[ pl] ) ;
int index = hashMap. get ( root. val) ;
root. left = dfs ( preorder, inorder, pl + 1 , pl + index - il, il, index - 1 ) ;
root. right = dfs ( preorder, inorder, pl + index - il + 1 , pr, index + 1 , ir) ;
return root;
}
}