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. 从前序与中序遍历序列构造二叉树-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

105. 从前序与中序遍历序列构造二叉树

leetcode-105,106 从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

Leetcode 105. 从前序与中序遍历序列构造二叉树

LeetCode105. 从前序与中序遍历序列构造二叉树

java刷题--105从前序与中序遍历序列构造二叉树

刷题-力扣-105. 从前序与中序遍历序列构造二叉树