从前序与中序遍历序列构造二叉树
题目
思路
二叉树相关的题目一般会马上想到递归
这里也一样,分别递归重建获得二叉树
重点:找到中序遍历中根节点位置的索引
重点api:
Arrays.copyOfRange(preorder, x , y);// copy的是一个左开右闭的区间 [x,y)
代码
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder == null || preorder.length == 0) return null;
//1.获取到根节点value的值
TreeNode root = new TreeNode(preorder[0]);
int index = findIndex(preorder,inorder);
//2.递归重构左子树buildTree(左子树的前序遍历数组,左子树的中序遍历数组);
root.left = buildTree(
Arrays.copyOfRange(preorder,1,index+1),
Arrays.copyOfRange(inorder,0,index) );
//3.递归重构右子树 buildTree(右子树的前序遍历数组,右子树的中序遍历数组);
root.right = buildTree(
Arrays.copyOfRange(preorder,index + 1, preorder.length),
Arrays.copyOfRange(inorder,index +1,inorder.length));
return root;
}
//这个方法用来找到根节点在中序遍历数组中的位置
public int findIndex(int[] preorder, int[] inorder){
int index = 0;
for(int i = 0; i < inorder.length;i++){
if(inorder[i] == preorder[0]){
return i;
}
}
return index;
}
}