思路
1)前序的第一个节点为根节点
2)在中序遍历中找到根节点,根节点左边为左子树,右边为右子树
3)左子树递归
4)右子树递归
代码
public TreeNode buildTree(int[] preorder, int[] inorder) {
//为了方便将用过的根节点删除,将前序数组放在list中
List<Integer> list = new ArrayList<>();
for(int i=0;i<preorder.length;i++){
list.add(preorder[i]);
}
return buildB(list,inorder,0,inorder.length-1);
}
private TreeNode buildB(List<Integer> preorder, int[] inorder, int left, int right) {
if(left>right || preorder.isEmpty()){
return null;
}
//构造根节点
int val=preorder.get(0);
preorder.remove(0);
TreeNode root = new TreeNode(val);
//找出根节点在中序数组中的位置
int mid=0;
for(int i=0;i<inorder.length;i++){
if(val==inorder[i]){
mid=i;
}
}
//根节点左边为左子树,右边为右子树
root.left=buildB(preorder,inorder,left,mid-1);
root.right=buildB(preorder,inorder,mid+1,right);
return root;
}