105. 从前序与中序遍历序列构造二叉树-字节跳动高频题
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]
二、解题
递归
前序遍历和中序遍历构造树的思路比较简单,就是先找到根节点,然后根据根节点划分为左子树和右子树,然后在根据前序遍历找到左右子树的根节点,继续划分。
class Solution
private Map<Integer, Integer> indexMap;
public TreeNode buildTree(int[] preorder, int[] inorder)
int n = preorder.length;
// 构造哈希映射,帮助我们快速定位根节点
indexMap = new HashMap<Integer, Integer>();
//将树的中序遍历中的数值放在哈希表中
for (int i = 0; i < n; i++)
indexMap.put(inorder[i], i);
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
//构造树
public TreeNode myBuildTree(int[] preorder, int[] inorder,int preleft,int preright,int inleft,int inright)
//终止条件
if(preleft > preright || inleft > inright)
return null;
//首先找到根节点的值 前序遍历的第一个数字
int preroot = preorder[preleft];
TreeNode root = new TreeNode(preroot);
//分割左右两个子树 其实也就是四个下标
int indexroot = indexMap.get(preroot);
//根据左子树的长度找到下一个左子树的右边界
int nextpreright = indexroot - 1 - inleft + preleft + 1;
//左子树
root.left = myBuildTree(preorder,inorder,preleft+1,nextpreright,inleft,indexroot-1);
root.right = myBuildTree(preorder,inorder,nextpreright+1,preright,indexroot+1,inright);
return root;
以上是关于105. 从前序与中序遍历序列构造二叉树-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章