class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
HashMap<Integer,Integer> index = new HashMap();
int n = preorder.length;
if(n==0){ //递归出口要记住。此时已经拆分成空数组了,应该返回null了
return null;
}
//数组不为空则创建结点
buildIndex(inorder,index); //建立索引与值的对应关系
TreeNode root = new TreeNode(preorder[0]); //创建根节点
int rootVal = preorder[0]; //前序遍历的第一个结点就是根节点,将这个值保存下来
int bj = index.get(rootVal); //找到这个值在中序序列下的位置,这个位置的值同时也是左子树的size,后面确定左子树的范围要用到左子树的大小
//递归创建左右子树,返回的结点正好作为左右子树,注意拷贝数组的函数Arrays.copyOfRange()
root.left = buildTree(Arrays.copyOfRange(preorder,1,1+bj),Arrays.copyOfRange(inorder,0,bj));
root.right = buildTree(Arrays.copyOfRange(preorder,bj+1,preorder.length),Arrays.copyOfRange(inorder,bj+1,inorder.length));
return root;
}
public void buildIndex(int[] inorder , HashMap<Integer,Integer> index){
for(int i = 0; i<inorder.length;i++){
index.put(inorder[i],i);
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
根据前序和中序序列重建二叉树 Leetcode 35
于 2022-02-17 22:44:51 首次发布