Toasobi
重建二叉树(中等)
本文最后更新于2023年03月03日,已超过677天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
这道题就是要你根据前序和中序遍历的结果让你构建一课二叉树
这题当时我都不会做
答案使用递归的方法,就是说当一个问题可以分为多次重复的子问题时,我们就应该想到递归,总结下来,该题就是通过分析两个遍历数组,运用map存中序对应的元素下标,先用前序找到根节点,再去map中对应下标,在中序数组中在根节点左边的就是左子树,右边就是右子树,然后循环这个任务,构建这棵数
<div>
class Solution {
private Map<Integer, Integer> indexMap;
public TreeNode myBuildTree(int[] preorder,int[] inorder,int pre_first,int pre_last,
int in_first, int in_last){
//终止条件
if(pre_first>pre_last || in_first>in_last){
return null;
}
//通过前序遍历找到根节点
int root_val = preorder[pre_first];
TreeNode root = new TreeNode(root_val);
//定位根节点
int root_index = indexMap.get(preorder[pre_first]);
//左子树的个数
int leftSize = root_index-in_first;
//递归构造左,右子树
root.left = myBuildTree(preorder,inorder,pre_first+1,pre_first+leftSize,in_first,in_first+leftSize-1);
//构建右子树
root.right = myBuildTree(preorder,inorder,pre_first+leftSize+1,pre_last,root_index+1,in_last);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = inorder.length;
indexMap = new HashMap<Integer, Integer>();
for(int i=0;i<inorder.length;i++){
indexMap.put(inorder[i],i);
}
return myBuildTree(preorder,inorder,0,n-1,0,n-1);
}
}
</div>