# 从前序与中序遍历序列构造二叉树

给定一棵树的前序遍历 preorder 与中序遍历  inorder。请构造二叉树并返回其根节点。

 

示例 1:

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

 

提示:

## template ```java public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder.length != inorder.length) return null; if (preorder.length == 0) return null; if (preorder.length == 1) return new TreeNode(preorder[0]); return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1); } private TreeNode buildTree(int[] preorder, int[] inorder, int prei, int prej, int ini, int inj) { if (prei > prej || ini > inj || prei < 0 || prej >= preorder.length || ini < 0 || inj >= inorder.length) return null; if (prej - prei < 0) return null; if (prei == prej) return new TreeNode(preorder[prei]); TreeNode root = new TreeNode(preorder[prei]); int inFlag = 0; for (int i = ini; i <= inj; i++) { if (inorder[i] == root.val) { inFlag = i; break; } } int num_left = inFlag - ini; int num_right = inj - inFlag; root.left = buildTree(preorder, inorder, prei + 1, prei + num_left, ini, inFlag - 1); root.right = buildTree(preorder, inorder, prej - num_right + 1, prej, inFlag + 1, inj); return root; } } ``` ## 答案 ```java ``` ## 选项 ### A ```java ``` ### B ```java ``` ### C ```java ```