[ 二叉树 ] 中序和后序遍历确定二叉树

利用二叉树中序及先序遍历确定该二叉树的后序序列 利用二叉树中序及先序遍历确定该二叉树的后序序列与上一题不同的是,先序序列中第一个元素为当前根节点,在中序中找到该元素后,确定左子树个数n和右子树节点个数m,那么先序序列中根节点后n个为其左子树,接下来m个位其右子树,然后递归处理中序:BFDAEGC 先序:ABDFCEG#include<iostream>#include<string.h>using namespace s... 阅读详情

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

中序和后序遍历确定二叉树

递归

  • 明确:分治
  • 左闭右开切割
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        // 构造返回值
        TreeNode* root = new TreeNode();

        // 空组返回
        if (postorder.empty()) return nullptr;

        // 寻找中序切割点, 也同样为根节点
        int cutPointValue = postorder[postorder.size() - 1];
        root->val = cutPointValue;

        // 如果只剩一个根结点直接返回即可
        if (postorder.size() == 1) return root;

        // 否则切割
        int inCutPoint = 0;
        for (; inCutPoint < inorder.size(); ++inCutPoint)
            if (cutPointValue == inorder[inCutPoint]) break;

        // 左闭右开原则
        vector<int> inLeft(inorder.begin(), inorder.begin() + inCutPoint);
        vector<int> inRight(inorder.begin() + inCutPoint + 1, inorder.end());

        int postCutPoint = inLeft.size();
        vector<int> postLeft(postorder.begin(), postorder.begin() + postCutPoint);
        vector<int> postRight(postorder.begin() + postCutPoint, postorder.end() - 1);

        root->left = buildTree(inLeft, postLeft);
        root->right = buildTree(inRight, postRight);

        return root;
    }
};
  • 空间优化 利用下标代替切割
  • 如果每次切割都创造新向量则会产生过多的空间开销
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return traversal(inorder, 0, inorder.size(), postorder, 0, postorder.size());
    }

    TreeNode* traversal(vector<int> &inorder, int inBegin, int inEnd,
        vector<int> &postOrder, int postBegin, int postEnd) {
        if (postBegin == postEnd) return nullptr;

        int rootValue = postOrder[postEnd - 1];
        TreeNode* root = new TreeNode(rootValue);

        if (postBegin == postEnd - 1) return root;

        int inCut = 0;
        for (; inCut < inEnd; ++inCut) {
            if (inorder[inCut] == rootValue) break;
        }
		
        // 传递下标代替切割
        int leftInBegin = inBegin;
        int leftInEnd = inCut;
        int rightInBegin = inCut + 1;
        int rightInEnd = inEnd;
        int leftPostBegin = postBegin;
        int leftPostEnd = postBegin + leftInEnd - leftInBegin;
        int rightPostBegin = leftPostEnd;
        int rightPostEnd = postEnd - 1;

        root->left = traversal(inorder, leftInBegin, leftInEnd, postOrder, leftPostBegin, leftPostEnd);
        root->right = traversal(inorder, rightInBegin, rightInEnd, postOrder, rightPostBegin, rightPostEnd);
        return root;
    }
};
根据二叉树的前序(后序)和 中序确定一个二叉树并以层次遍历输出 这里只给出后序和中序确定二叉树的方法,前序和中序是差不多的; 先给出代码:   #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cmath&gt; #include&lt;cstring&gt; #include&lt;cstdlib&gt; #include&lt;cstdio&gt; #include&lt;... 阅读详情

相关推荐

LiblibAI新手教程:从零开始训练你的第一个LoRA模型(保姆级指南)

本文提供LiblibAI平台上从零开始训练LoRA模型的保姆级教程,涵盖数据准备、参数优化到效果调优全流程。详细解析LoRA技术优势,包括云端计算资源、自动化预处理工具等,帮助新手快速掌握自定义模型训练技巧,实现高效AI绘画创作。

dell8的博客 621

二叉树的遍历-由中序和后序遍历序列确定一颗二叉树

概述 中序遍历的结果和后序遍历的结果可以确定一颗二叉树 方法 后序序列可以知道根结点和子树的子节点;中序序列可以知道根结点(子树的子节点)的左子树有哪些元素,右子树有哪些元素 推演 中序遍历序列和后序遍历序列确定树 中序序列:cbedahgijf 后序序列:cedbhjigfa 案例 Given the postorder and inorder traversal sequences 给出后序和中序序列 you are supposed to output th...

eeeemon的博客 8017

AIOps智能运维:从数据治理到故障自愈的实践指南

AIOps(智能运维)通过融合人工智能与运维管理,构建了感知-决策-执行的闭环体系。其核心技术包括多维度数据采集、机器学习算法和自动化执行,显著提升了告警治理、故障定位和容量预测的效率。在数据层,全量性、实时性的数据采集是基础,而算法层的异常检测和根因分析则依赖统计方法、孤立森林和LSTM等模型。AIOps尤其适用于处理告警风暴和复杂系统故障,如在电商大促中通过K-Means聚类减少92%的告警量。随着云原生和边缘计算的普及,AIOps正逐步实现与Service Mesh、Serverless等技术的深度集

weixin_30175731的博客 288

根据二叉树的先序、中序、后序遍历构建二叉树-图文详解

引言:根据一颗二叉树,可以得出他的先序、中序、后序三种遍历方式,那么如果我们知道了他的前序、中序遍历,如何绘制出这颗二叉树呢? 1、二叉树三种遍历方式的特性 特性A,对于前序遍历,第⼀个肯定是根节点; 特性B,对于后序遍历,最后⼀个肯定是根节点; 特性C,利⽤前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左⼦树和右⼦树; 特性D,对左⼦树和右⼦树分别做前⾯3点的分析和拆分,相当于做递归,我们就可以重建出完整的⼆叉树; 2、根据特性构建二叉树 例:已知一颗二叉树的前序遍历和中序遍历.

梦想不会灭 1万+

4.图像sensor的特性和驱动解析

例子:sensor驱动自己提供操作曝光时间的函数和获取曝光时间的函数,然后将这个函数注册到ISP库和3A算法库,3A算法库根据外部光照强度计算出一个Sensor曝光时间的设置值,ISP库得到这个设置值,然后通过Sensor之前注册的回调函数,把这个值设置到Sensor的硬件寄存器中去,实现整个过程。是为 ISP 配置正确的输入时序。(1)修改驱动源码(sambashar\Hi3518E_SDK_V1.0.3.0\package\mpp\component\isp\sensor\ar0130)

weixin_53762042的博客 3566

SC-FDMA

<br />SC-FDMA(Single-carrier Frequency-Division Multiple Access,單載波分頻多工),是LTE的上行鏈路的主流多址。<br />SC-FDMA是單波載(Single-carrier),與OFDMA相比之下具有的較低的PAPR(峰值/平均功率比,peak-to-average power ratio),比多載波的PAPR低1-3dB左右(PAPR是由于多載波在频域叠加引起)。更低的PAPR可以使行動終端(mobile terminal)在發送功效方面

jod的专栏 3299

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

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

阳阳的博客 3595

【AI智能体】Hermes Agent 从部署到项目实战操作详解

Hermes Agent 桌面版从安装到实战操作详解

congge 5138

中序和后序(前序和中序)序列确定一颗二叉树

中序遍历的结果和后序遍历的结果可以确定一颗二叉树或者前序遍历和中序遍历但是前序后和后序无法确定一颗二叉树由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分。例如俩二叉树前序:1 2 3 后序:3 2 1。

weixin_50809457的博客 2720

OpenClaw人人养虾:发现与传输

客户端需要先"发现"Gateway 的地址和端口,才能建立连接。OpenClaw 支持多种发现(Discovery)和传输(Transport)机制。

王国平的博客 572

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

GTX IP配置完了,你不得搞个回环测试一番?

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

【二叉树】如何通过(前序|后序)和中序确定一个二叉树

但是如果只有前序和后序就无法确定一个唯一的二叉树,因为无法确定根的左右子树。当题目为 “通过后序和中序得出二叉树” 时,前序:A B C D E F G H I。中序:B D C A E H G I F。带入中序的左根右口诀,可以得出。同样根据前序根左右,可以确定。是EHGIF的根结点,结点无左子树,右子树为。(如下图),至此完成。

葫芦娃子救我的博客 2581

流体动力学仿真软件:CFX_(10).案例实践:复杂流场分析

在“Phases”选项卡中,定义参与仿真的不同相。例如,如果您要分析气液两相流,可以定义“Air”和“Water”两个相。

kkchenjj的博客 1689

二叉树的前(先)序中序和后序遍历 以及如何通过两个序列确定唯一二叉树

文章目录三种遍历前(先)序遍历。中序遍历。后序遍历。举几个例子两个序列确定一个二叉树 最近做了一套卷子,考了二叉树的遍历。有点生疏,回顾一下,如何通过两种遍历序列确定一颗二叉树。 三种遍历 先中后表示对根节点访问的先后顺序,对子树都是先左后右。 前(先)序遍历。 遍历顺序是 根节点 -&gt;左子树(节点)-&gt;右子树(节点) 可以理解成 1 存在根节点,访问根节点 2 存在左子树或节点的...

熊仙森滴Blog 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

swust oj 983和984 利用二叉树中序及后序遍历确定该二叉树的先序序列

思路: 1.983:当前树的后续遍历的最后一个元素肯定是根节点。中序遍历中根节点左边是左子树,右边是右子树,递归处理。 2.984:当前树的先续遍历的第一个元素肯定是根节点。中序遍历中根节点左边是左子树,右边是右子树,递归处理。 3.两种方法进行顺序相反 983: 利用二叉树中序及后序遍历确定该二叉树的先序序列 题目描述 已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其

weixin_45733897的博客 2030

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

根据先序和中序遍历确定二叉树的后序遍历

分析: 只要清楚了先序中序后序的含义 先序是中左右 中序是左中右 后序是左右中 那么我们只要在递归的: 在先序列里取第一个元素 这个元素就是根元素 然后在中序列里找到根 根的左边(左子树)作为下一次递归的(左)中序列 右边(右子树)作为下一次递归的(右)中序列 然后根据左右边的个数在先序列里截取作为左右的先xulie 先进入右递归 再进入左递归 然后输出根的值 # Determining the ...

沃沃头同学的博客 1221

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

利用二叉树中序及先序(后序)遍历确定该二叉树的后序(先序)序列

利用二叉树中序及先序遍历确定该二叉树的后序序列: suwst oj#984 1.原理很简单先根据先序第一个节点为根节点的性质查找根节点在中序遍历中的位置以便确定中序遍历左右子树的节点个数。 2.根据左右子树节点个数确定先序遍历中左右子树 的遍历情况。 3.重复上面步骤。 附代码: #include <iostream> #include <string> using nam...

chineseherofeng的博客 1230

SWUST OJ983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

983: 利用二叉树中序及后序遍历确定该二叉树的先序序列 题目描述 已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。 输入 第一行为中序序列 第二行为后续序列 输出 输出为遍历二叉树得到的先序序列 样例输入 BFDAEGC FDBGECA 样例输出 ABDFCEG 思路: 后序遍历输出的最后一个值是树的根节点,已知根节点,可以在中序遍历中找到这个根节点的左

xiaodaitongxue的博客 1937

先序+后序遍历不能确定一棵二叉树

如上图两个树,先序遍历都为ab,后序遍历都为ba。 一般来说,如果二叉树中存在度为1的节点,则根据 先序 和 后序 遍历不能唯一确定该二叉树。 leetcode 106. 从中序与后序遍历序列构造二叉树 参考自: https://zhidao.baidu.com/question/530938551.html ...

aaqian1的博客 854

利用二叉树中序及后序遍历确定该二叉树的先序序列

利用二叉树中序及后序遍历确定该二叉树的先序序列中序:BFDAEGC 后序:FDBGECA后序遍历是先访问右节点,然后访问左节点,最后访问根节点中序遍历是先访问左节点,然后访问根节点,最后访问右节点    可以知道后序输出中的最后一个字符A即为该二叉树的根节点,然后在中序遍历中找到该节点A的位置,其左边BFD为A的左子树,其右边EGC为A的右子树    在中序中找到A左子树节点的个数和右子树节点的个...

umalaka的博客 988

两种写法解决利用二叉树中序及后序遍历确定该二叉树的先序序列问题

利用二叉树中序及后序遍历确定该二叉树的先序序列 中序遍历:DCBFEGAH 后序遍历:DCFGEBHA 根据中序遍历和后续遍历的性质: 1.它们都是先遍历左子树。 2.后序遍历中从右到左依次为对应子树的根结点。 3.中序遍历中若我们找到一个根节点,那么在一个范围内,根节点的左边为左子树,右边为右子树。 过程如下: 1.DCBFEG AH DCFGEB HA, A为根节点,在中序遍历中它的左边即为左子树(6个节点),右边为右子树(1个节点);在后序遍历中我们即可根据左右子树的节点个数确定后序遍历中的左右子

麦片不加糖 750

【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

就二叉树的基础遍历方法展开,最后落到树的同构检验实现上。

记录学习痕迹的公众号:Piper蛋窝 1291

确定一棵二叉树!| LeetCode 106. 从中序与后序遍历序列构造二叉树

postorder = [9,15,7,20] 左子树大小为1,则[9]为左子树,剩下为右子树[15,7,20]//先从后序确定根节点,再从中序区分左和右,然后从后序得到同样的左右子树,结合右子树中序遍历[15,20,7]和后序遍历[15,7,20],右子树的根节点为20。//利用根节点的索引将中序结果分为左子树和右子树(除开根节点)//再利用左右子树的节点个数对后序结果进行左右划分。结合左子树中序遍历[9]和后序遍历[9],只有一个节点[9]为参照,左边[9]为左子树,右边[15,20,7]为右子树。

2302_76739243的博客 1005

SWUST OJ 983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

题目描述 知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。 输入 第一行为中序序列 第二行为后续序列 输出 输出为遍历二叉树得到的先序序列

无奈清风吹过的博客 971
上一篇: [ 二叉树 ] 完全二叉树结点个数
下一篇: [ 二叉树 ] 最大二叉树
Kalv1n
博客等级 码龄7年 35粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值