package leetcode;
/**
* projectName: study000
* time: 2020/12/18 22:04
* description:前中序构建二叉树
*/
public class ti_105 {
// 递归法
/**
* @param preorder 先序遍历数组
* @param inorder 中序遍历数组
* @return 数组根节点
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTreeHelper(preorder,inorder, 0,preorder.length,0,inorder.length);
}
public TreeNode buildTreeHelper(int[] preorder, int[] inorder,int preLeft,int preRight,int inLeft,int inRight){
// 先序遍历的个数为0的时候,递归结束.
if (preLeft == preRight){
return null;
}
// 先序遍历的值,第一个必须是根节点
int rootVal = preorder[preLeft];
// 构建根节点
TreeNode root = new TreeNode(rootVal);
// 从中序遍历中获取根节点
// 根节点左侧为左子树,右侧为右子树
int i = inLeft;
for (; i < inRight; i++) {
if (inorder[i] == rootVal){
break;
}
}
// 获取左子树的个数
int high = i - inLeft;
// 递归构建左右子树
root.left = buildTreeHelper(preorder,inorder,preLeft + 1,preLeft + high + 1,inLeft,i);
root.right = buildTreeHelper(preorder,inorder,preLeft + high + 1,preRight,i + 1,inRight);
return root;
}
}