代码随想录算法训练营第25天|LeetCode106.中序和后序遍历构造二叉树、LeetCode105.中序和先序遍历构造二叉树

news2024/12/24 0:21:27

代码随想录算法训练营第25天|LeetCode106.中序和后序遍历构造二叉树、LeetCode105.中序和先序遍历构造二叉树

1、LeetCode106.中序和后序遍历构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

知道理论怎么求,但是太久没写递归代码忘了。为了节省时间直接看视频讲解了。

思路

  1. 中序遍历无法得到根节点的位置,需要从后序遍历得到。那么后序遍历的最后一个元素即根节点。
  2. 但后序遍历无法得到左右区间,因此需要中序遍历。在中序中找到根节点的左右区间,进行切割。对后序进行相应的切割。
  3. 然后继续递归

106.从中序与后序遍历序列构造二叉树

代码的步骤

  1. 后序数组为空,应返回空节点
  2. 后序数组只有一个元素,直接返回
  3. 后序数组的最后一个元素作为节点元素
  4. 寻找中序数组位置做切割点
  5. 切中序数组
  6. 切后序数组
  7. 递归处理左右区间

代码

  • 需要注意坚持“左闭右开”的原则。
  • vector判断函数empty(),或者size()==0
  • find(begin, end, val)按值查找,返回迭代器,减去begin即索引
  • 递归的逻辑一开始没弄明白
class Solution {
public:
    TreeNode* traversal(vector<int>& inorder, int inbegin, int inend, vector<int>& postorder, int postbegin, int postend){
        // 1 为空,返回NULL
        if(postend == postbegin)    return NULL;

        // 2 只有一个元素,直接返回root
        if(postend - postbegin == 1){
            TreeNode* root = new TreeNode(postorder[postend-1]);
            return root;
        }

        // 3 找到后序遍历最后一个节点作为根节点
        TreeNode* root = new TreeNode(postorder[postend-1]);
        int rootValue = postorder[postend-1];

        // 4 切割中序遍历
        // 找到索引
        int delimiter_index = find(inorder.begin(), inorder.end(), rootValue) - inorder.begin();
        // 切割 左闭右开
        int left_in_begin = inbegin;
        int left_in_end = delimiter_index;
        int right_in_begin = delimiter_index + 1;
        int right_in_end = inend;

        // 5 切割后序遍历 左闭右开
        int left_post_begin = postbegin;
        int left_post_end = postbegin + (left_in_end - left_in_begin);
        int right_post_begin = left_post_end;
        int right_post_end = postend - 1; 

        // 6 递归处理左右区间
        root->left = traversal(inorder, left_in_begin, left_in_end, postorder, left_post_begin, left_post_end);
        root->right = traversal(inorder, right_in_begin, right_in_end, postorder, right_post_begin, right_post_end);
        return root;
        
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.empty() || postorder.empty())
            return NULL;
        return traversal(inorder, 0, inorder.size(), postorder, 0, postorder.size());
    }
};

2、LeetCode105.中序和先序遍历构造二叉树

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

和上一题的思路应该是一模一样的,所以可以直接改。我自己改试试

犯错:先序遍历获取根节点的时候直接取索引为0了,应该是prebegin才对。

/**
 * 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* traversal(vector<int>& inorder, int inbegin, int inend, vector<int>& preorder, int prebegin, int preend){
        // 1 为空,返回NULL
        if(preend == prebegin)    return NULL;

        // 2 只有一个元素,直接返回root
        if(preend - prebegin == 1){
            TreeNode* root = new TreeNode(preorder[prebegin]);
            return root;
        }

        // 3 找到后序遍历最后一个节点作为根节点
        TreeNode* root = new TreeNode(preorder[prebegin]);
        int rootValue = preorder[prebegin];

        // 4 切割中序遍历
        // 找到索引
        int delimiter_index = find(inorder.begin(), inorder.end(), rootValue) - inorder.begin();
        // 切割 左闭右开
        int left_in_begin = inbegin;
        int left_in_end = delimiter_index;
        int right_in_begin = delimiter_index + 1;
        int right_in_end = inend;

        // 5 切割先序遍历 左闭右开
        int left_pre_begin = prebegin + 1;
        int left_pre_end = left_pre_begin + (left_in_end - left_in_begin);
        int right_pre_begin = left_pre_end;
        int right_pre_end = preend; 

        // 6 递归处理左右区间
        root->left = traversal(inorder, left_in_begin, left_in_end, preorder, left_pre_begin, left_pre_end);
        root->right = traversal(inorder, right_in_begin, right_in_end, preorder, right_pre_begin, right_pre_end);
        return root;
        
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(inorder.empty() || preorder.empty())
            return NULL;
        return traversal(inorder, 0, inorder.size(), preorder, 0, preorder.size());
    }
};

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

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

相关文章

Adaptive Partitioning

qnx开源代码 GitHub - vocho/openqnx: mirror of git://git.code.sf.net/p/monartis/openqnx http://www.qnx.com/developers/docs/7.0.0/#com.qnx.doc.adaptivepartitioning.userguide/topic/about_howtouseguide_.html ap是对进程和线程集合分配最小的系统资源&#xff0c;目…

基于nodejs+vue宿舍管理系统python-flask-django-php

随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建宿舍管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种楼宇信息、宿舍信息、宿舍安排、缺勤信息等于一…

OceanBase中NOT EXISTS是否需要被改写

作者简介 张瑞远&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证包括 Oce…

直播预告丨困气排气解决新方案--毅速金属3D打印随形透气钢

您是否也遇到过这些问题 模具困气造成产品出现注塑瑕疵&#xff0c;但复杂的产品形状导致无法开排气槽 常规透气钢需要拆镶件导致工件强度下降 某些工件部分不接受分模线区域无法拆镶件无法使用常规透气钢 面对越来越复杂的产品和结构&#xff0c;越来越多需要透气、保压、…

全网最新网络安全自学路线,最详细没有之一!!!

在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 我把自己整理的系统学习路线&#xff0c;拿出来跟大家分享了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#xff09; 1…

Spring 面试——restcontroller/requestmapping

RestController Controller ResponseBody Controller&#xff1a;包含Component&#xff0c;把当前类声明成为一个 bean ResponseBody&#xff1a;表示方法返回的结果直接作为 HTTP 响应的内容&#xff0c;不是返回视图 3.RequestMapping注解的基本用法_哔哩哔哩_bilibili

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

如何本地部署Imagewheel并实现无公网IP远程连接打造个人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

域名SSL证书怎么获取?

获取域名证书的步骤如下&#xff1a; 选择认证机构&#xff1a;域名证书必须从受信任的认证机构(CA)中申请&#xff0c;如JoySSL、GeoTrust、、Thawte等。收集信息&#xff1a;在申请域名证书之前&#xff0c;需要准备一些证明信息&#xff0c;如域名认证等。创建CSR&#xff…

【ARXIV2402】MambaIR

这个工作首次将 Mamba 引入到图像修复任务&#xff0c;关于为什么 Mamba 可以用于图像修复&#xff0c;作者有非常详细的解释&#xff1a;一路向北&#xff1a;性能超越SwinIR&#xff01;MambaIR: 基于Mamba的图像复原基准模型 作者认为Mamba可以理解为RNN和CNN的结合&#xf…

实战 | 微调训练TrOCR识别弯曲文本

导 读 本文主要介绍如何通过微调训练TrOCR实现弯曲文本识别。 背景介绍 TrOCR&#xff08;基于 Transformer 的光学字符识别&#xff09;模型是性能最佳的 OCR 模型之一。在我们之前的文章中&#xff0c;我们分析了它们在单行打印和手写文本上的表现。 TrOCR—基于Transforme…

基于ARM 的Linux系统的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在 MacOS 中安装 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告 本教程可以包含过时的信息。 此步骤已在 Ubuntu Linux 12.04 上进行了测试&#xff0c;但应…

跳蚱蜢(蓝桥杯)

文章目录 跳蚱蜢题目描述答案&#xff1a;20bfs 跳蚱蜢 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff1a; 有 9 只盘子&#xff0c;排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢&#xff…

JVM 基础知识

JAVA code加载执行顺序&#xff1a; *.java --->*.class->类装载子系统、字节码执行引擎 JVM虚拟机组成&#xff1a; 堆、方法区&#xff08;元空间&#xff09;、栈&#xff08;线程&#xff09;、本地方法栈、程序计数器 栈帧组成&#xff1a; 栈帧&#xff1a;局部…

管理类联考–复试–管理类知识–计划

决策是管理的核心&#xff0c;决策是计划的前提&#xff0c;计划是管理的首要职能&#xff0c;战略是一种计划。 #mermaid-svg-kwa82umCx6PXrp8x {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kwa82umCx6PXrp8x .e…

Linux操作系统及进程(三)进程优先级及特性

目录 一、优先级概念 二、查看系统进程 三、进程切换 一、优先级概念 1.cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 2.优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。…

在面对API的安全风险,WAAP全站防护能做到哪些?

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间和企业内部系统交互的核心组件。在应用程序开发过程中&#xff0c;API能够在不引起用户注意的情况下&#xff0c;无缝、流畅地完成各种任务。例如从一个应用程序中提取所需数据并传递给…

Web漏洞-SQL注入之二次、加密、DNS加密注入

实例1&#xff1a;sqli-labs21 输入admin&#xff0c;admin 测试&#xff1a; 可以看到注入点在cookie处&#xff0c;发送到decoder&#xff08;解密&#xff09; 所以如果要注入&#xff0c;需要将注入语句加密 Eg&#xff1a;admin’ and 11加密后&#xff1a;YWRtaW4ZIGFu…

95% 的公司面临 API 安全问题

API 对企业安全发挥着关键作用&#xff0c;但绝大多数企业都为此遭受日益严重的安全风险。据安全公司 Fastly最近做的一项调查显示&#xff0c;84% 的受访企业缺乏足够的API安全措施&#xff0c;95%的企业在过去1年中遇到过 API 安全问题。 此外&#xff0c;79%的受访企业出于A…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…