当前位置: 首页 > article >正文

LeetCode105. 从前序与中序遍历序列构造二叉树(2024秋季每日一题 49)

给定两个整数数组 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 < = p r e o r d e r . l e n g t h < = 3000 1 <= preorder.length <= 3000 1<=preorder.length<=3000
  • i n o r d e r . l e n g t h = = p r e o r d e r . l e n g t h inorder.length == preorder.length inorder.length==preorder.length
  • − 3000 < = p r e o r d e r [ i ] , i n o r d e r [ i ] < = 3000 -3000 <= preorder[i], inorder[i] <= 3000 3000<=preorder[i],inorder[i]<=3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

思路:

  • 递归构建每一个子树
  • 对于当前子树,前序遍历的首个节点是根节点,中序遍历根节点左边遍历的是左子树,右边是右子树
  • 所以先通过前序遍历找出子树根节点,构建根节点,通过中序遍历找出左子树,右子树,然后递归构建
  • 让当前子树根节点左子节点指向左子树,右子节点指针指向右子树
  • 返回子树根节点即可
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        return buildTree(preorder, inorder, 0, n - 1, 0, n - 1);
    }
    TreeNode* buildTree(vector<int>& pv, vector<int>& iv, int pl, int pr, int il, int ir){
        if(pl > pr || il > ir) return nullptr; 
        TreeNode* root = new TreeNode(pv[pl]);
        int idx = il;
        while(iv[idx] != pv[pl]) idx++;
        root -> left = buildTree(pv, iv, pl + 1, pl + 1 + (idx-1-il), il, idx - 1);
        root -> right = buildTree(pv, iv, pl + 1 + (idx-il), pr, idx + 1, ir);
        return root;
    }
};

http://www.kler.cn/news/366903.html

相关文章:

  • 【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构
  • 数据库的诗篇:深入探索 MySQL 表操作的艺术与哲学
  • 在 Spring 中使用 @Cacheable 和 @CacheEvict
  • 免费PDF页面提取小工具
  • 2024MathorCup大数据竞赛 B题基本思路
  • 2024年妈杯MathorCup大数据竞赛A题超详细解题思路
  • 地磁传感器(学习笔记上)
  • 微信小程序文字转语音播报案例
  • 基于Java SpringBoot和Vue社区医院诊所医疗挂号管理系统设计
  • 【超大数据】数字的拆分——int128数据类型的使用方法
  • Spring Cloud微服务:构建现代应用的新基石
  • 【笔记】软件测试09——接口测试
  • 图文深入理解Oracle Total Recall
  • Ubuntu虚拟机无法启动,无U盘拯救
  • GoogleChrome和Edge浏览器闪屏问题
  • 图片懒加载
  • MATLAB工具箱使用案例详解
  • Vuejs设计与实现 — 编译层面的优化
  • Walrus + Sui:如何充分发挥Web3的潜力
  • vue中$nextTick的作用是什么,什么时候使用
  • docker-minio启动参数
  • vue3嵌套路由二级跳转三级路由时,如何阻止走二级的生命周期
  • Vulnhub打靶-DC-2
  • python批量漏洞检测工具编写
  • KUKA机器人选定程序时提示“选择非法”的处理方法
  • JSON语法学习分析