代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTree_(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
//end 不包括指向的元素,初始时,start指向数组的0下标,end指向数组尺寸
public TreeNode buildTree_(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd){
//递归的出口
if(inStart == inEnd || preStart == preEnd){
return null;
}
int rootVal = preorder[preStart];
TreeNode root = new TreeNode(rootVal);
int inorderRootIndex = 0;
//找到根节点再中序遍历数组的位置,前提数组没有重复元素
for(int i = 0; i < inorder.length; i++){
if(inorder[i] == rootVal){
inorderRootIndex = i;
break;
}
}
//左子树长度
int leftNum = inorderRootIndex - inStart;
//递归的过程
root.left = buildTree_(preorder, preStart + 1, preStart + leftNum + 1, inorder, inStart, inorderRootIndex);
root.right = buildTree_(preorder, preStart + leftNum + 1, preEnd, inorder, inorderRootIndex + 1, inEnd);
return root;
}
}