方法1: recursion。这题关键点在于找到每一层的root节点。root节点就是preorder第一个元素,然后我们在inorder数组里面找出与preorder第一个元素相等的元素,记录下这个index。然后我们利用这个index就可以将两个数组分别分为左右两个部分,然后再分别进行recursion。时间复杂n,空间复杂logn。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0) return null;
if(preorder.length == 1) return new TreeNode(preorder[0]);
TreeNode root = new TreeNode(preorder[0]);
int rootIndex = 0;
for(int i = 0; i < inorder.length; i++){
if(inorder[i] == preorder[0]){
rootIndex = i;
}
}
root.left = buildTree(Arrays.copyOfRange(preorder,1,1+rootIndex), Arrays.copyOfRange(inorder,0,rootIndex));
root.right = buildTree(Arrays.copyOfRange(preorder,1+rootIndex,preorder.length), Arrays.copyOfRange(inorder,rootIndex+1,inorder.length));
return root;
}
}
总结:
- 这题主要我觉得是找规律,找到规律就很容易了。