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

利用二叉树中序及先序遍历确定该二叉树的后序序列 利用二叉树中序及先序遍历确定该二叉树的后序序列与上一题不同的是,先序序列中第一个元素为当前根节点,在中序中找到该元素后,确定左子树个数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;... 阅读详情

相关推荐

VS2022命令行编译C++报错?一招解决‘fatal error C1034: iostream: 不包括路径集‘

本文针对VS2022命令行编译C++时常见的'fatal error C1034: iostream: 不包括路径集'错误,深入剖析了其根源在于环境变量缺失。文章提供了永久配置用户环境变量(PATH、INCLUDE、LIB)的一劳永逸解决方案,确保在任何终端中都能直接使用cl命令进行编译,并给出了进阶配置与常见错误排查指南。

weixin_29011667的博客 304

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

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

eeeemon的博客 8017

华为od 面试八股文_数据库_01_含答案

华为od 面试八股文_数据库_01_含答案

MISAYAONE的博客 2167

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

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

梦想不会灭 1万+

c++ webrtc基础(1) :webrtc源码下载与编译、项目模块介绍、学习资料推荐

本篇博客介绍webrtc源码的下载与编译,以及推荐webrtc学习资料。 源码下载 电脑环境:win10/win11 64bit,合理的上网环境,没有合理的网络环境无法拉取、下载webrtc代码和工具,宽带速度要快,尽量50M. 主要步骤如下: (1) 安装git (2) 打开cmd控制台,下载google开发工具depot_tools: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git (3) 新建一个目

琅嬛福地 3298

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6594

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

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

阳阳的博客 3595

39、高频 LLC 谐振转换控制系统动态优化算法分析与研究

本文针对高频下LLC谐振转换器动态性能差的问题,提出一种基于谐振电容器充放电估计动态切换时间的优化控制算法。通过改进状态轨迹控制方法,突破传统算法在谐振频率与开关频率相等条件下的限制,并结合新型采样策略有效抑制电压过冲。算法在MATLAB和SABER中完成仿真验证,并搭建基于STM32F407的原型系统进行测试,结果表明该方法显著缩短动态响应时间,提升系统稳定性。研究为高频、高功率密度开关电源的动态优化提供了可行解决方案。

linux6sysadmin的博客 111

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

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

weixin_50809457的博客 2720

uniapp - 解决报错 canvasToTempFilePath: fail canvas is empty 画布为空错误,生成海报相册、二维码、条码、裁剪/拼合操作图片报错,加了this还是报错

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,canvasToTempFilePath:失败画布为空,报错,canvasToTempFilePath:failcanvasisempty,不支持2d,还是报错,this,加上this还是报错,vue3没有this怎么办?海报,保存到手机相册,生成二维码,显示条码,图像裁切,图片处理,canvas报错,无法解决,还是fail,依然报错,传了this也不好使,Uniapp小程序,如何解决这个问题

🏆 前端领域优质创作者 4708

地表最强之Android微信语音/腾讯会议通话录音

地表最强之Android微信语音/腾讯会议通话录音

cczhengv 6107

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

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

葫芦娃子救我的博客 2581

Android AVB 分析(十六)5 个例子彻底理解 FEC(Reed-Solomon) 的工作原理

关于 FEC 是如何工作的,一直是我 Android OTA 讨论群中的未解话题,大家基本上都不清楚 Android 上面的 FEC 是如何工作的,为什么在 OTA 升级的最后阶段,FEC 的编码计算会消耗大量的 IO 资源,并持续很长时间。接下来的几篇,我会从一个程序员的角度,演示基于里德所罗门编码的 FEC 到底是如何工作的。

洛奇看世界 669

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

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

熊仙森滴Blog 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

weixin_45733897的博客 2030

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

沃沃头同学的博客 1221

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

利用二叉树中序及先序遍历确定该二叉树的后序序列: 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、付费专栏及课程。

余额充值