/**
* 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) {
TreeNode root = help(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);
return root;
}
TreeNode help(int[] pre, int[] in, int preLeft, int preRight, int inLeft, int inRight) {
//递归返回条件,当前序数组的长度或者中序数组的长度为0的时候,返回null
if(preLeft > preRight || inLeft > inRight) {
return null;
}
//构造根节点
TreeNode root = new TreeNode(pre[preLeft]);
System.out.println(root.val);
int rootIndex = 0;
//找到中序遍历中根的位置,作为分割点
for(int i = 0; i < in.length; i++) {
if(in[i] == pre[preLeft]) {
rootIndex = i;
break;
}
}
//左子树的节点数
int leftNum = rootIndex - inLeft;
//右子数的节点数
int rightNum = inRight - rootIndex;
//构造左子树
TreeNode left = help(pre, in, preLeft + 1, preLeft + leftNum, inLeft,rootIndex - 1);
//构造右子树
TreeNode right = help(pre, in, preLeft + leftNum + 1, preLeft + leftNum + rightNum,
rootIndex + 1, inRight);
root.left = left;
root.right = right;
//返回
return root;
}
}