解题思路
1.先是找到根节点preorder[0]同时找到它对应在中序遍历中的位置index,可以写个方法去获取他在inorder中的位置
2.必须搞清楚中序遍历和前序遍历之间存在的关系.
3.根据在inorder获取的preorder[i]的下标,可以将inorder分为两半,一半是当前节点的左子树,一半是当前节点的右子树.
话不多说上代码:
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder == null || inorder == null){
return null ;
}
return build( preorder, inorder,0,preorder.length-1);
}
public int index = 0;
public TreeNode build(int[] preorder, int[] inorder,int is , int ie){
//函数的递归出口
if(is > ie){
return null;
}
TreeNode root = new TreeNode( preorder[index]);
//在find函数中找到先序遍历节点在中序遍历中的位置
int i = find( inorder,is,ie,preorder[index]);
index++;
root.left = build( preorder, inorder, is ,i-1 );
root.right = build( preorder, inorder,i+1 ,ie);
return root;
}
//在中序遍历中找前序节点的位置.
public int find( int[] inorder,int is , int ie,int key){
for(int i = 0 ; i <= inorder.length-1 ; i++){
if(key == inorder[i]){
return i ;
}
}
return -1;
}