剑指 Offer 07. 重建二叉树
题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
题解1:递归法
主要思路:
- 递归参数:前序遍历数组左下标,右下标,中序遍历数组左下标,右下标
- 递归流程:
- 先判断递归终止条件为 左下标大于右下标,递归结束返回null
- 前序遍历第一个值为根节点,建立根节点
- 寻找前序遍历第一个值在中序遍历中的索引位置
- 递归的建立左子树和右子树
- 返回 根节点
代码:
class Solution {
HashMap<Integer,Integer> map=new HashMap<>();
int[] preorder;
int[] inorder;
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder=preorder;
this.inorder=inorder;
//将中序遍历序列加入map中,方便查找索引
for (int i = 0; i < inorder.length; i++) {
map.put(inorder[i],i);
}
return createTree(0,preorder.length-1,0,inorder.length-1);
}
public TreeNode createTree(int preL,int preR,int inL,int inR){
//结束条件判断
if(preL>preR||inL>inR){
return null;
}
int rootVal=preorder[preL];
TreeNode root=new TreeNode(rootVal);
int pivotIndex=map.get(rootVal);//获取根节点在中序遍历中的下标索引
//递归建立左右子树
root.left=createTree(preL+1,preL+pivotIndex-inL,inL,pivotIndex-1);
root.right=createTree(preL+pivotIndex-inL+1,preR,pivotIndex+1,inR);
return root;
}
}
复杂度分析:
- 时间复杂度:O(N)
- 空间复杂度:O(N)