注意:
(1)前序遍历(pre)的第一个是二叉树的头节点
(2)中序遍历(vin)中的vin[i] == pre[0] ,i的前边是做左节点,i的后边是右节点
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
int plen = pre.length;
int vlen = vin.length;
//判断数组是否为空
if(plen == 0 || vlen == 0){
return null;
}
//创建一个节点 (先序遍历第一个是头节点)
TreeNode head = new TreeNode(pre[0]);
//用中序遍历,遍历每一个节点
for(int i=0; i<vlen; i++){
if(pre[0] == vin[i]){
//找到第一个节点则pre的第pre[1]个数到pre[i]个是左节点,vin的vin[0]到vin[i-1]是左节点
//Arrays.copyOfRange 左闭右开
head.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(vin,0,i));
//右节点 原理同上
head.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,plen),Arrays.copyOfRange(vin,i+1,vlen));
//找到head就只用让他们递归就行不用再往后循环直接跳出
break;
}
}
return head;
}
}