LeetCode地址:剑指 Offer 07. 重建二叉树
- 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
- 示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:
Input: preorder = [-1], inorder = [-1]
Output: [-1]
限制:0 <= 节点个数 <= 5000
- 二叉树的前序遍历中,第一个数字总是树的根节点的值,但是在中序遍历序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值的左边,而右子树的节点的值位于根节点的值的右边,因此可以通过前序遍历中,根节点的值确定出在中序遍历序列中的位置进而得出左子树的长度。
- 时间复杂度O(n) 空间复杂度O(n)
class Solution {
private Map<Integer,Integer> indexMap;
public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorderLeft, int preorderRight, int inorderLeft, int inorderRight){
if(preorderLeft>preorderRight){
return null;
}
int preorderRoot = preorderLeft;
int inorderRoot = indexMap.get(preorder[preorderRoot]);
TreeNode root = new TreeNode(preorder[preorderRoot]);
int sizeLeftSubtree = inorderRoot - inorderLeft;
root.left = myBuildTree(preorder,inorder,preorderLeft+1,preorderLeft+sizeLeftSubtree,inorderLeft,inorderRoot-1);
root.right = myBuildTree(preorder,inorder,preorderLeft+sizeLeftSubtree+1,preorderRight,inorderRoot+1,inorderRight);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length;
indexMap = new HashMap<>();
for (int i = 0; i < n; i++) {
indexMap.put(inorder[i],i);
}
return myBuildTree(preorder,inorder,0,n-1,0,n-1);
}
}