C++算法练习-day38——106.从中序和后序遍历序列构造二叉树

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

题目来源:. - 力扣(LeetCode)

题目思路分析

题目要求根据一棵二叉树的中序遍历(inorder)和后序遍历(postorder)结果重建这棵二叉树。中序遍历的特点是左子树 -> 根节点 -> 右子树,而后序遍历的特点是左子树 -> 右子树 -> 根节点。利用这两个遍历的特点,我们可以递归地重建整棵树。

  1. 后序遍历的最后一个元素是根节点:因为后序遍历是左子树 -> 右子树 -> 根节点的顺序,所以最后一个元素一定是当前子树的根节点。
  2. 在中序遍历中找到根节点的位置:一旦确定了根节点,我们可以在中序遍历中找到这个根节点的位置,这个位置将中序遍历分为左子树和右子树两部分。
  3. 递归构建左右子树:根据中序遍历中根节点的位置,我们可以将后序遍历也分为两部分,分别对应左子树和右子树。然后递归地对这两部分进行中序和后序遍历的重建。

代码:

/**  
 * 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>& inorder, vector<int>& postorder) {  
        int n = postorder.size();  
        if (n == 0) {  
            // 如果后序遍历为空,说明子树为空  
            return nullptr;  
        }  
        // 后序遍历的最后一个元素是根节点  
        TreeNode* node = new TreeNode(postorder[n-1]);  
        if (postorder.size() == 1) {  
            // 如果后序遍历只有一个元素,说明整棵树只有一个节点  
            return node;  
        }  
        int incise;  
        // 在中序遍历中找到根节点的位置  
        for (incise = 0; incise < inorder.size(); incise++) {  
            if (inorder[incise] == postorder[n-1]) {  
                break;  
            }  
        }  
        // 根据根节点的位置,将中序遍历和后序遍历分割为左右子树  
        vector<int> leftinorder(inorder.begin(), inorder.begin() + incise);  
        vector<int> rightinorder(inorder.begin() + incise + 1, inorder.end());  
        vector<int> leftpostorder(postorder.begin(), postorder.begin() + leftinorder.size());  
        vector<int> rightpostorder(postorder.begin() + leftinorder.size(), postorder.end() - 1);  
        // 递归构建左右子树  
        node->left = buildTree(leftinorder, leftpostorder);  
        node->right = buildTree(rightinorder, rightpostorder);  
        return node;  
    }  
};

知识点摘要

  1. 二叉树遍历:
    • 中序遍历:左子树 -> 根节点 -> 右子树
    • 后序遍历:左子树 -> 右子树 -> 根节点
  2. 递归:
    • 递归是一种在函数内部调用自身的方法,常用于解决可以分解为相似子问题的问题。
  3. 动态数组(vector):
    • 在C++中,vector是一个可以动态调整大小的数组,提供了方便的元素访问和操作方法。

通过本题,我们学习了如何利用二叉树的中序遍历和后序遍历结果来重建二叉树。这种方法依赖于递归,通过在后序遍历中找到根节点,然后在中序遍历中分割出左右子树,再递归地对左右子树进行同样的操作。这种方法不仅锻炼了我们对二叉树遍历的理解,还加深了对递归思想的应用。在实际编程中,递归是一种强大的工具,可以帮助我们解决许多看似复杂的问题。

VS Code配置MinGW64编译非线性优化库NLopt VS Code用MinGW64编译C++代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。:若使用非UCRT版本(如传统MinGW64),替换所有路径中的。库文件会自动安装到MSYS2的。 阅读详情

相关推荐

超声信号处理——硬件电路中的混频应用

本文介绍了超声多普勒系统的信号处理原理。系统通过波形振荡器产生高频信号,经换能器转换为超声波发射,接收反射信号后与原始信号混频,利用三角函数的积化和差特性产生包含多普勒频移的低频差频信号和高频和频信号。通过低通滤波器滤除高频成分后,即可获得纯净的多普勒信号。这种处理方法将MHz级高频信号转换为可听低频信号,降低了系统复杂度与成本。数学推导表明,差频信号频率正好

fcxgfdjy的博客 1125

后序+中序序列构造二叉树

PTA 作业

plairlli的博客 883

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

从中序与后序遍历序列构造二叉树-力扣

【代码】从中序与后序遍历序列构造二叉树-力扣。

why_12134的博客 1090

【Linux】实际项目应该如何完成?--安防监控系统项目的总结

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。...

修成真的博客 6729

RK3568开发笔记- (TX/RX) RGMII delayline 功能调试

本文详细介绍了RK3568芯片RGMII接口delayline功能的调试过程。针对千兆以太网通信不稳定问题,通过分析RGMII时序要求,利用RK3568内置的delayline功能补偿信号延迟。调试方法包括扫描delayline窗口、测试中间值配置、优化硬件设计等步骤。文章还总结了常见问题解决方案,如PHY选型建议和自动扫描功能配置。最终实现了千兆速率下丢包率降至0.01%以下的目标,为类似开发场景提供了实用参考。

flypig has a dream! 317

二叉树的构造:从中序和后序序列构造二叉树(前序遍历)

一层层切割,故想到递归 如果数组大小为0,说明是空结点了 如果不为空,则去后序数组最后一个元素作为节点元素 找到后序数组最后一个元素在中序数组的位置,作为切割点 切割中序数组,切割为中序左数组和中序右数组(一定是先切割中序数组) 切割后序数组,切为后序左数组和后序右数组 递归处理左区间和右区间 中序数组大小一定是和后序数组的大小相同的(这是必然)。 故可以根据切好的中序来分割后序 class Solution { public: //inorder.size() == postorder.size.

weixin_42438346的博客 899

042_小驰私房菜_MTK Camera yuv旋转90度方案

做旋转可以在app层接收到数据后,自行做旋转,也可以在hal层,针对yuv format这路流进行旋转。那我们做旋转也可以采用类似的方式。预览和录像是正常的,这个是因为预览和录像有方向相关属性可以调整,系统会根据摄像头mount的角度已经当前设备的方向,进行对应的旋转。这个下面这个文件,可以修改摄像头的mount角度。,可以看到前摄的Orientation是270,所以原始出图是做了90度的旋转。这个方案,思路就是在配流信息中,将rotation信息进行修改。注:本文章所用权归:小驰成长圈,禁止转载宣传!

587

二叉树的创建以及中序遍历方法

#include <stdio.h> #include <malloc.h> typedef struct pNode{ int data; struct pNode *lchild; struct pNode *rchild; }pNode,*treeNode; //二叉链表,以线性链表表示二叉树 void init_BiTree(treeNode node...

chp_woAIdan的博客 634

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 633

十四种逻辑器件综合对比——《器件手册--逻辑器件》

逻辑器件是数字电路中最基本的逻辑单元,用于实现基本的逻辑运算,如与、或、非、异或等。逻辑门根据输入信号的组合产生相应的输出信号。与门:只有当所有输入信号都为高电平时,输出才为高电平。或门:只要有一个输入信号为高电平,输出就为高电平。非门:输出信号与输入信号相反。异或门:当两个输入信号不同时,输出为高电平;相同则输出为低电平。用于对输入信号进行反相操作,即将高电平转换为低电平,低电平转换为高电平。常用于信号的反相处理和逻辑电平的转换。

XU157303764的博客 2030

哈希表——由中序和后序序列构建二叉树

后序序列最后一个就是根节点,再在中序序列中定位根节点....... 一、递归法 Java:这里要把两个数组和postRight定义为成员变量,这样就不用一直传参了。如果当作参数传递的话,会超出时间限制。C++需要定义数组的时候需要指明大小,所以这里c++数组还是当参数传递的。 注意:要先构建右子树,再构建左子树,原因我也没太理解......... /** * Definition for a binary tree node. * public class TreeNode { * ..

m0_51467734的博客 336

【Autoware】2小时安装Autoware1.13(保姆级教程)

Autoware是一款“一体化”开源自动驾驶软件,能实现感知、决策、控制等功能,通过在Ubuntu中搭建Autoware开发环境和案例的运行,使大家对自动驾驶技术的实现有一个更清晰的认识。

DevFrank的博客 1万+

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

首先回忆一下如何根据两个顺序构造一个唯一的二叉树,就是以后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。此时,中序数组切成了左中序数组和右中序数组,后序数组切割成左后序数组和右后序数组。首先要切割中序数组,为什么先切割中序数组呢?后序数组的切割点怎么找?

qq_46130027的博客 148

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

「leetcode」106.从中序与后序遍历序列构造二叉树 & 105. 从前序与中序遍历序列构造二叉树 (详解)

构造二叉树登场!

代码随想录 1627

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

前序中序/中序后序构造二叉树(C++)

在本篇文章中,我们将会用前序和中序构造一棵二叉树,也可以用中序和后序构造一颗二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树以上就是今天要讲的内容,本文仅仅详细介绍了前序中序/中序后序构造二叉树。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘。

lim6ere的博客 1566

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

7 后序+中序序列构造二叉树

后序+中序序列构造二叉树 输入样例: 第一行输入序列长度n,第二行输入n个字符表示二叉树后序遍历的序列,第三行输入n个字符表示二叉树中序遍历的序列 9 GHDBEIFCA GDHBAECIF 结尾无空行 输出样例: 输出二叉树先序遍历的序列。 ABDGHCEFI 结尾无空行 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct node{ char d

qq_53369146的博客 2289

OJ-leetcode-106. 从中序与后序遍历序列构造二叉树(递归、二叉树)

目录 题目 思路 代码 结果 优秀题解 提升笔记 全部代码 相关题目 题目 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 链接:https://leetcode-cn.com/problems/construct...

关注网络安全、云原生安全 928

头歌(C语言)-数据结构与算法-二叉树-先序遍历/中序遍历

为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"btrechar.h"中的函数的形式给出,并假设该库函数中定义了二叉树指针和结点类型分别为bitre和bnode,以及部分常用运算,例如构建二叉树、以某种方式显示二叉树等。:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"btrechar.h"中的函数的形式给出,并假设该库函数中定义了二叉树指针和结点类型分别为bitre和bnode,以及部分常用运算,例如构建二叉树、以某种方式显示二叉树等。

weixin_59436900的博客 3602

代码随想录-二叉树【从中序与后序遍历序列构造二叉树】

下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割)

weixin_46184703的博客 1679

C语言,通过后序遍历和中序遍历的结果,建二叉树。

C语言,通过后序遍历和中序遍历的结果,建二叉树。

qq_63917380的博客 1513

【例题】已知二叉树的后序序列和中序序列构造二叉树

做下列例题之前请先转到:【教程】了解原理和方法。然后再做下面的例题。 已知二叉树的中序遍历序列为DEBAFCG,后序遍历序列为EDBFGCA,试画出该二叉树。 【答案】 解析: 详细过程如下: step1: 该二叉树的后序序列为EDBFGCA,中序序列为DEBAFCG,通过这两个序列可以得出: A是根结点,DEB是A结点的左子树,FCG是A结点的右子树。 如下图: step2:先看A结点的左子树DEB 该左子树DEB的后序序列为:EDB,中序序列为:DEB 通过这两个序列可以得出:B是根结点,D

muyuxifeng的博客 1万+

7-2 后序+中序序列构造二叉树

后序+中序序列构造二叉树

qq_53843555的博客 1204

7-4 后序+中序序列构造二叉树

后序+中序序列构造二叉树。

weixin_60593311的博客 1343

【数据结构】二叉树的创建和遍历(先序、中序、后序)

二叉树的创建和遍历:先序中序后序 最近一段时间学习了数据结构中二叉树的基本操作,包括二叉树的结构、二叉树的创建、递归先序中序后序遍历、非递归遍历等,想和网友一起共同交流。

m0_63448210的博客 2万+

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

一、题目描述 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder =[9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 二、思路 思路来源于图解构造二叉树之中序+后序,画得图是真心棒 前提 解决此问题的关键在于要很熟悉树的各种遍历次序代表的什么,最好能够将图画出来。本题解带你先进行中序遍历和后续遍历二叉树,然后再根据遍历结果将二叉树进行还原。 首先,来.

阳阳的博客 3595
上一篇: C++算法练习-day36——513.找树左下角的值
下一篇: C++算法练习-day39——654.最大二叉树
Neophyte0608
博客等级 码龄3年 808粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

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

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

打赏作者

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

抵扣说明:

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

余额充值