前言
-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚LeetCode每日一题打卡!
-🏃放弃不难,但坚持一定很酷。
105 从中序与前序遍历序列构造二叉树
🔊问题描述
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
🎱运行示例
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
👓提示
-
1 <= preorder.length <= 3000
-
inorder.length == preorder.length
-
-3000 <= preorder[i], inorder[i] <= 3000
-
preorder 和 inorder 均 无重复 元素
-
inorder 均出现在 preorder
-
preorder 保证 为二叉树的前序遍历序列
-
inorder 保证 为二叉树的中序遍历序列
🥇代码示例
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
int perlen = preorder.length;
int inlen = inorder.length;
// 针对特殊情况示例进行排除
if(perlen != inlen) {
return null;
}
// 构建哈希表存储中序遍历中的数字与下标,方便后续在前序序列中找到根节点时能快速找到中序遍历中对应的根节点以及返回他所在的下标
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < inlen; i++) {
map.put(inorder[i], i);
}
// 构造新的函数,返回的是一颗完整的树
return buildTree(preorder,0,perlen-1,map,0,inlen-1);
}
private TreeNode buildTree(int[] preorder, int preorderleft, int preorderright, Map<Integer, Integer> map, int inorderleft, int inorderright) {
// 如果是边界超越,即是不满足条件,直接返回空结点
if(preorderleft > preorderright || inorderleft > inorderright) {
return null;
}
// 先从前序遍历中得到根节点
int rootval = preorder[preorderleft];
// 利用这个根节点新建一个树进行存储后面进行返回
TreeNode root = new TreeNode(rootval);
// 利用哈希表在中序遍历中找到根节点的位置
int pIndex = map.get(rootval);
// 位置关系如下图所示,递归进行构造树
root.left = buildTree(preorder, preorderleft+1, pIndex-inorderleft+preorderleft, map, inorderleft, pIndex-1);
root.right = buildTree(preorder, pIndex-inorderleft+preorderleft+1, preorderright, map, pIndex+1, inorderright);
return root;
}
}