解析:根据前序列表判断根的位置,然后在根据中序列表根节点值的位置确定左子树和右子树。然后递归调用。直到子树的遍历列表长度为1停止。
代码:
/**
*
* @param preorder 前序遍历
* @param inorder 中序遍历
* @return
*/
private static TreeNode buildTree(int[] preorder, int[] inorder) {
int length = preorder.length;
if (length == 0){
return null;
}
// 只有一个元素 递归的出口,前序的长度为1
if (length == 1){
return new TreeNode(preorder[0]);
}
//确定根节点
TreeNode root = new TreeNode(preorder[0]);
// 在中序里面去找根节点的下标
int index = 0;
for (int i=0;i<inorder.length;i++){
if (root.val==inorder[i]){
index = i;
}
}
// 取出左子树的前序遍历
int[] leftPreTree = Arrays.copyOfRange(preorder,1,index+1);
// 取出左子树的中序遍历
int[] leftInTree = Arrays.copyOfRange(inorder,0,index);
// 生成左子树 递归
root.left = buildTree(leftPreTree,leftInTree);
// 取出右子树的前序遍历
int[] rightPreTree = Arrays.copyOfRange(preorder,index+1,length);
// 取出右子树的前序遍历
int[] rightInTree = Arrays.copyOfRange(inorder,index+1,length);
// 生成右子树 递归
root.right = buildTree(rightPreTree,rightInTree);
return root;
}