力扣刷题--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 保证 为二叉树的中序遍历序列

思路分析

  • 首先需要知道手动是如何构造二叉树的

  • 难点是如何找对应下标

完整代码

class Solution {
public:
    TreeNode* buildTree(vector<int>& pre, vector<int>& in) {
        //key是数组的值,value是下标
        unordered_map<int,int>m;
        for(int i=0;i<in.size();i++)
            m[in[i]]=i;
        //只关心有哪些参数,返回值是
        return f(pre,0,pre.size()-1,in,0,in.size()-1,m);
    }
    TreeNode* f(vector<int>&pre,int l1,int r1,vector<int>&in,int l2,int r2,unordered_map<int,int>&m){
        if(l1>r1)//base case
            return NULL;
        TreeNode*head=new TreeNode(pre[l1]);
        int k=m[pre[l1]];//找k
        head->left=f(pre,l1+1,l1+k-l2,in,l2,k-1,m);
        head->right=f(pre,l1+k-l2+1,r1,in,k+1,r2,m);
        return head;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农小小苏

感谢大佬支持!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值