题目链接:LeeCode105从前序与中序遍历中遍历二叉树
题目描述:
这个题真的是折磨死我,因为对前序中序概念理解的不是太好,脑子里面没有这种概念,憋了我两天,最后是又看视频又看题解终于想明白了。
前序遍历是 根->左序列->右序列
中序遍历是 左序列->根->右序列
做法就是相当于遍历一遍前序,当 前序序列 下标所在点在 中序序列 中前面没有其他点的时候这个前序序列点后面的就是他的右子树序列
每次取前序序列的头,就是当前遍历的根节点,再根据根节点分出左右序列
class Solution {
public static TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer,Integer> map=new HashMap<>();
for (int i = 0; i < inorder.length; i++) {
//储存中序序列中每一个数据对应的下标
map.put(inorder[i],i);
}
return mytree(preorder,0,preorder.length,inorder,0,inorder.length,map);
}
public static TreeNode mytree(int[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end,Map<Integer,Integer> map){
//pre_start每次都是当前序列开始下标加1,pre_end是中序根节点前面的长度+pre_start,所以就是当中序中左或右为空返回
if(pre_start>=pre_end) return null;
//获取根节点下标
Integer integer = map.get(preorder[pre_start]);
//把当前的节点当作根节点
TreeNode root=new TreeNode(preorder[pre_start]);
//中序中根节点减开始位置即下一个序列长度
int len=integer-in_start;
root.left=mytree(preorder, pre_start+1, pre_start+len+1, inorder, in_start, integer, map);
root.right=mytree(preorder, pre_start+len+1, pre_end, inorder, integer+1, in_end, map);
return root;
}
}