dfs每次规定前序和中序的边界,递归构建左右儿子
注意预处理每个序号在中序里的位置,以免超时
/**
* 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 {
int []pre = new int [3010];
int []in = new int [3010];
int []pos = new int[6010];
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0)
return null;
pre = preorder;
in = inorder;
int r_pre = preorder.length;
int r_in = r_pre;
int l_in = 0;
int l_pre = 0;
for(int i=0;i<r_pre;i++)
pos[in[i]+3000] = i;
TreeNode head = createNode(l_pre,r_pre,l_in,r_in);
return head;
}
public TreeNode createNode(int l_pre, int r_pre, int l_in, int r_in){
// System.out.println(l_pre);
// System.out.println(r_pre);
// System.out.println(l_in);
// System.out.println(r_in);
// System.out.println();
if(l_pre >= r_pre)
return null;
TreeNode ans = new TreeNode(pre[l_pre]);
int mid_pos = pos[pre[l_pre]+3000];
int num_left = mid_pos - l_in;
int num_rig = r_in - mid_pos-1;
ans.left = createNode(l_pre+1,l_pre+1+num_left,l_in,mid_pos);
ans.right = createNode(r_pre - num_rig,r_pre,mid_pos+1,r_in);
return ans;
}
}