Leetcode面试经典150题-106.从中序和后序序列构造二叉树

news2024/12/24 9:12:47

  解法都在代码里,不懂就留言或者私信

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    /**解这个题你首先要知道二叉树的中序和后序遍历有啥特性
    中序:先左子树,后根,然后右子树
    后序:先左孩子,后右孩子,然后根
    一般二叉树构造这种问题我们首要的是先找到根在哪,通过中序是找不到根的。
    你要先通过后序找到根(最后那个),然后在中序中找根的位置,中序中根之前的是左子树,根之后的是右子树
    反正这么递归的搞,一会就出来了 */
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return buildTree(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
    }
    /**我们这里调用这个函数的前提是inStart~inEnd和postStart~postEnd长度一定相同,不然没有任何意义
    这个函数的含义是从inOrder的inStart~inEnd和postOrder的postStart~postEnd构造二叉树并返回根*/
    public TreeNode buildTree(int[] inorder, int[] postorder, int inStart, int inEnd, int postStart, int postEnd) {
        /**如果就一个元素,那毫无疑问就是当前的根*/
        if(inStart == inEnd) {
            return new TreeNode(inorder[inStart]);
        }
        if(inStart > inEnd) {
            return null;
        }
        /**否则把postEnd位置作为根*/
        int rootValue = postorder[postEnd];
        int rootIndex = -1;
        for(int i = inStart; i <= inEnd; i++) {
            if(inorder[i] == rootValue) {
                rootIndex = i;
                break;
            }
        }
        /**构造当前的根节点 */
        TreeNode root = new TreeNode(rootValue);
        /**左子树是中序序列中rootIndex之前的部分,右子树是中序序列中rootIndex之后的部分
        后序序列也要取同等长度,左子树的长度是rootIndex-inStart
        这里一定要注意右子树的结束是postEnd-1而不是postEnd*/
        root.left = buildTree(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + (rootIndex-inStart)-1);
        root.right = buildTree(inorder, postorder, rootIndex + 1, inEnd, postStart + (rootIndex-inStart), postEnd-1);
        return root;
    }   
}

递归解法可能常数时间比较高,只能保证时间复杂度是O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2103413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作为HR如何解决薪资谈判的僵局

作为HR如何跟候选人谈薪资问题&#xff0c;特别候选人的期望值&#xff0c;和公司对岗位的设定范围存在不对等的情况下&#xff0c;HR和候选人的薪资谈判往往就陷入僵局。面对这种情况&#xff0c;是直接放弃&#xff0c;还是有努力的空间呢&#xff1f; 在面对薪资谈判僵局时…

基于tesseract实现文档OCR识别

导入环境 导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库&#xff0c;用于图像处理。 import numpy as np import argparse import cv2设置命令行参数 ap argparse.ArgumentParser() ap.add_argument("-i", "--imag…

中国各省份-环境规制相关数据(2000-2022年)

环境规制&#xff0c;也称为环保政策和污染治理&#xff0c;是一系列由政府制定的旨在解决环境问题、保护生态环境和促进可持续发展的政策措施。这些措施包括法律法规、行政命令、经济激励和市场机制等&#xff0c;目的是约束和指导企业和个人行为&#xff0c;减少对环境的负面…

【吊打面试官系列-Redis面试题】Redis 的同步机制了解么?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 的同步机制了解么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 的同步机制了解么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 可以使用主从同步&#xff0c;从从同…

Linux运维--iptables防火墙命令以及端口号等详解(全)

Linux之iptable防火墙命令以及端口号等详解&#xff08;全&#xff09; 在Linux系统中&#xff0c;你可以使用firewalld和iptables来管理和设置防火墙规则。Firewalld是一个动态管理防火墙的工具&#xff0c;而iptables是一个更底层的工具&#xff0c;可以直接配置Linux内核的…

经典卷积神经网络 (CNN) 架构模型详解:LeNet、AlexNNet、GoogleNet、ResNet、DenseNet

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

文字转视频软件哪个好用?揭秘创意新工具

最近&#xff0c;我在筹备一个小型的个人项目&#xff0c;需要制作一系列的教学视频&#xff0c;但我对视频编辑一窍不通。就在我快要放弃的时候&#xff0c;我发现了一些神奇的工具&#xff0c;它们能自动把文字变成视频&#xff01; 想知道自动生成视频的软件有哪些吗&#…

Docker 安装FileBeat、Elasticsearch及Kibana详细步骤

一、ELK简介 二、docker安装Elasticsearch 2.1 创建Docker网络 2.2 拉取镜像 2.3 创建挂载目录 2.4 添加配置文件 2.5 创建es容器 2.6 测试Elasticsearch是否安装成功 三、docker安装Logstash 3.1 拉取镜像 3.2 创建挂载目录 3.3 添加配置文件 3.4 创建Logstash容…

如何更新我的SSL证书到期日期?

续订SSL证书需要获取新证书来替换即将过期的证书。该过程可能略有不同&#xff0c;具体取决于Gworg获取证书的方法。以下是有关如何续订SSL证书的一般指南&#xff1a; 检查有效期&#xff1a; 在开始续订流程之前&#xff0c;请检查SSL证书的当前到期日期。您通常可以在SSL证…

【PyTorch】深入解析 `with torch.no_grad():` 的高效用法

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、with torch.no_grad(): 的作用二、with torch.no_grad(): 的原理三、with torch.no_grad(): 的高效用法3.1 模…

24 初识C++

目录 一、C概念 &#xff08;一&#xff09;C是什么 &#xff08;二&#xff09;C的历史 &#xff08;三&#xff09;C参考文档 二、第一个C程序 三、C的域 四、命名空间 namespace &#xff08;一&#xff09;namespace 的作用 &#xff08;二&#xff09;namespace 的…

如何从 SIM 卡恢复短信?这篇专业教程文章会帮到你

您是 Android 手机的忠实用户吗&#xff1f;您是否定期通过打电话、发送短信或在 WeChat 上聊天来与朋友和家人保持联系&#xff1f;如果你这样做&#xff0c;我相信你的手机上一定有很多短信&#xff0c;这些短信对于保存你与他人聊天的内容非常重要。您是否有这样的经验&…

碧桂园服务上海项目获评“2024年度上海市物业管理优秀示范项目”

近日&#xff0c;上海市物业管理行业协会发布《关于2024年度上海市物业管理优秀示范项目评定结果的公示》官方红头文件。文件对上海市393个物业管理优秀示范项目进行公示。 上海联源物业发展有限公司露香园项目、静鼎安邦府邸项目、佘山东郡项目和上海金晨物业经营管理有限公司…

mac 安装brew并配置国内源

​ 前置条件 - Xcode 命令行工具 一行代码安装Homebrew 添加到路径(PATH) - zsh shell为例 背景介绍 最近重装了我的MAC mini &#xff08;m1 芯片&#xff09;, 很多软件都需要重新安装&#xff0c;因为后续还需要安装一些软件&#xff0c;所以想着安装个包管理软件 什么…

苹果手机通话记录怎么恢复?已总结了4个方法,快速恢复

苹果手机的通话记录是我们联系好友与家人的重要方式之一。如果我们忘记储存重要好友或家人的联系方式&#xff0c;但是曾经有过通话&#xff0c;那我们就可以在苹果手机的通话记录中找到重要的联系人。但是&#xff0c;如果这些通话记录不小心被删除了&#xff0c;那苹果手机通…

ArkUI-状态管理最佳实践

ArkUI-状态管理最佳实践 概述合理选择装饰器使用监听和订阅精准控制组件刷新Watch装饰器监听数据源使用自定义事件发布订阅 概述 在声明式UI编程范式中&#xff0c;UI是应用程序状态的函数&#xff0c;应用程序状态的修改会更新响应的UI界面。ArkUI采用了MVVM模式。 ArkUI提…

2024年第十届数维杯国际大学生数学建模挑战赛

竞赛介绍 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力&#xff0c;内蒙古创新教育学会、内蒙古基础教育研究院决定主办2024年第十届数维杯国际大学生数学建模挑战赛&#xff08;国际赛&#xff09;。 数维杯大学生数学建模挑战赛每年分为两场&#…

uniapp开发鸿蒙,是前端新出路

uniapp开发鸿蒙&#xff0c;是前端新出路吗&#xff1f; 相信不少前端从业者一听uniapp支持开发鸿蒙Next后非常振奋。小编作为7年前端也是非常激动&#xff0c;第一时间体验了下。在这里也给大家分享一下我的看法 uniapp开发鸿蒙优势 1.对于前端开发者而言&#xff0c;几乎无需…

基于51单片机的跑马串口调试波形发生器proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1WTjU_hRJ-fLMTT5g1q-NlA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

嵌入式全栈开发学习笔记---C++(多态)

目录 多态polymorphic 多态成立的三个条件 1、要有继承 2、要有虚函数重写 3、用父类指针(父类引用)指向子类对象 重载与重写区别 动态联编和静态联编 多态原理 构造函数中调用虚函数能否实现多态&#xff1f; 用父类指针指向子类数组 虚析构函数 动态类型识别 第…