题目描述:
图解分析:
左子树:
右子树:
代码实现:
import java.util.*
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0 || inorder.length == 0) {
return null;
}
//根据前序数组的第一个元素,就可以确定根节点
TreeNode root = new TreeNode(preorder[0]);
for(int i = 0;i < preorder.length; i++) {
//用preorder[0]去中序数组中查找对应的元素
if(preorder[0] == inorder[i]) {
//将前序数组分成左右两半,再将中序数组分成左右两半
int[] pre_left = Arrays.copyOfRange(preorder,1,i+1);
int[] pre_right = Arrays.copyOfRange(preorder,i+1,preorder.length);
int[] in_left = Arrays.copyOfRange(inorder,0,i);
int[] in_right = Arrays.copyOfRange(inorder,i+1,inorder.length);
//递归处理前序数组的左边部分和中序数组的左边部分
//递归处理前序数组的右边部分和中序数组右边部分
root.left = buildTree(pre_left,in_left);
root.right = buildTree(pre_right,in_right);
break;
}
}
return root;
}
}
其中,Arrays.copyOfRange(array[] original,int from,int to)
将一个原始的数组original,从下标from开始复制,复制到上标to,生成一个新的数组。【注】这里包括下标from,不包括上标to。