输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7383b4154520004a086b838b37758c1.png)
抓住重点,数组内不含重复数字,可以建立映射,从preorder中得出数字然后映射到inorder
思路:根节点在preorder中生成,左右子树界限在中序遍历中确定。所以只需保留先序遍历,缓冲中序遍历进map集合
class Solution {
int[] preorder;
private Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
for(int i = 0; i < inorder.length; i++){
map.put(inorder[i],i);
}
return myBuildTree(0,0,inorder.length - 1);
}
private TreeNode myBuildTree(int pre_root_id, int in_left_id, int in_right_id){
if(in_left_id > in_right_id)
return null;
TreeNode root = new TreeNode(preorder[pre_root_id]);
int in_root_id = map.get(preorder[pre_root_id]);
root.left = myBuildTree(pre_root_id + 1, in_left_id, in_root_id - 1);
int leftCount = in_root_id - 1 - in_left_id + 1;
root.right = myBuildTree( pre_root_id + in_root_id - 1 - in_left_id + 1 + 1, in_root_id + 1, in_right_id);
return root;
}
}