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

135 阅读1分钟

“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;
    }
 
}

四、总结:

  • 好了,代码撸完,我们总结一下
    • 根据特性获取根节点

    • 查出左子树区间和右子树区间

    • 递归构建即可

最后这个算法是Leetcode的第105题,是热题100里的题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点赞关注,如果你也在刷热题100的话,希望可以对你有一些启发!