“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
今天写了二叉树的中序遍历,所以打算把热题100中关于二叉树的题,都解一遍,方便大家专项学习
一、题目描述
- 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
二、思路分析
-
题意说明是给出前序遍历和中序遍历让咱们反推二叉树
-
前序遍历是中左右中序遍历是左中右
-
所以先从前序遍历中取得根节点,在去中序遍历中获取左子树区间和右子树区间
-
进行递归构建即可,最后拼上即可
三、AC 代码:
class Solution {
//用于存中序遍历的数组下标和值
private Map<Integer,Integer>indexMap;
public TreeNode buildTree(int[] preorder, int[] inorder) {
int length = preorder.length;
indexMap = new HashMap<>();
//存中序遍历的数组下标和值
for(int i = 0;i<length;i++){
indexMap.put(inorder[i],i);
}
//构建树
return buildTree(preorder,inorder,0,length - 1,0,length -1);
}
public TreeNode buildTree(int[] preorder,int[] inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){
//边界条件判断
if(preorder_left > preorder_right){
return null;
}
//先获取根节点
int preorder_root = preorder_left;
//根据根节点找出区间
int inorder_root = indexMap.get(preorder[preorder_root]);
//构建树
TreeNode root = new TreeNode(preorder[preorder_root]);
int size = inorder_root - inorder_left;
//递归构建左子树
root.left = buildTree(preorder,inorder,preorder_left+1,preorder_left+size,inorder_left,inorder_root -1);
//递归构建右子树
root.right = buildTree(preorder,inorder,preorder_left+size+1,preorder_right,inorder_root+1,inorder_right);
return root;
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:-
根据特性获取根节点
-
查出左子树区间和右子树区间
-
递归构建即可
-