原数组+左右子树的边界
首先找到根节点在中序遍历中的下标,根据此下边可以得到左子树有多少个结点count。 根据根节点的下标以及左子树有多少个结点,将原数组划分为左右子树两部分 。通过计算可得到左右子树在原数组的坐标范围。 创建根结点,左右孩子可通过递归左右子树数组得到。 递归结束条件:当先序(中序也行)的左边界大于右边界时返回空。
public TreeNode buildTree ( int [ ] xianxu, int [ ] zhongxu, int xl, int xr, int zl, int zr) {
if ( xl > xr) {
return null;
}
int mid = zl;
while ( xianxu[ xl] != zhongxu[ mid] ) {
mid++ ;
}
int count = mid - zl;
TreeNode root = new TreeNode ( zhongxu[ mid] ) ;
root. left = buildTree ( xianxu, zhongxu, xl+ 1 , xl+ count, zl, mid- 1 ) ;
root. right = buildTree ( xianxu, zhongxu, xl+ count+ 1 , xr, mid+ 1 , zr) ;
return root;
}
生成子数组
import java. util. Arrays;
class Solution {
public TreeNode buildTree ( int [ ] preorder, int [ ] inorder) {
if ( preorder. length == 0 || inorder. length == 0 ) {
return null;
}
int gen = preorder[ 0 ] ;
int i = 0 ;
while ( i < inorder. length && inorder[ i] != gen) {
i++ ;
}
int [ ] inleft = Arrays. copyOfRange ( inorder, 0 , i) ;
int [ ] inright = Arrays. copyOfRange ( inorder, i+ 1 , inorder. length) ;
int [ ] preleft = Arrays. copyOfRange ( preorder, 1 , inleft. length+ 1 ) ;
int [ ] preright = Arrays. copyOfRange ( preorder, inleft. length+ 1 , preorder. length) ;
TreeNode root = new TreeNode ( gen) ;
root. left = buildTree ( preleft, inleft) ;
root. right = buildTree ( preright, inright) ;
return root;
}
}