算法 分治算法 核心思想 可以根据前序遍历找到每一颗树的根节点,将中序遍历分为两个部分,分别定义左子树方法和右子树方法。 代码
class Solution {
int num = 0 ;
public TreeNode buildTree ( int [ ] preorder, int [ ] inorder) {
TreeNode root = new TreeNode ( preorder[ 0 ] ) ;
int i = 0 ;
for ( ; i < inorder. length; ++ i) {
if ( inorder[ i] == preorder[ 0 ] ) break ;
}
num++ ;
leftTree ( preorder, inorder, root, 0 , i- 1 , 1 ) ;
rightTree ( preorder, inorder, root, i+ 1 , inorder. length- 1 , i+ 1 ) ;
return root;
}
void leftTree ( int [ ] preorder, int [ ] inorder, TreeNode root, int start, int end, int web) {
if ( start == end) {
root. left = new TreeNode ( inorder[ start] ) ;
num++ ;
return ;
}
if ( start > end) return ;
int i = start;
for ( ; i <= end; ++ i) {
if ( inorder[ i] == preorder[ web] ) break ;
}
root. left = new TreeNode ( preorder[ web] ) ;
root = root. left;
num++ ;
leftTree ( preorder, inorder, root, start, i- 1 , web+ 1 ) ;
rightTree ( preorder, inorder, root, i+ 1 , end, num - 1 > i ? num : i+ 1 ) ;
}
void rightTree ( int [ ] preorder, int [ ] inorder, TreeNode root, int start, int end, int web) {
if ( start == end) {
root. right = new TreeNode ( inorder[ start] ) ;
num++ ;
return ;
}
if ( start > end) return ;
int i = start;
for ( ; i <= end; ++ i) {
if ( inorder[ i] == preorder[ web] ) break ;
}
root. right = new TreeNode ( preorder[ web] ) ;
root = root. right;
num++ ;
leftTree ( preorder, inorder, root, start, i- 1 , web+ 1 ) ;
rightTree ( preorder, inorder, root, i+ 1 , end, num - 1 > i ? num : i+ 1 ) ;
}
}